import collections.abc class struct_array_view(collections.abc.MutableSequence): def __init__(self, struct, data): self._struct = struct self._data = data self._size = struct.calcsize() def __len__(self): if len(self._data) % self._size: raise ValueError() return len(self._data) // self._size def __getitem__(self, i): return self._struct.unpack(self._data[self._getslice(i)]) def __setitem__(self, i, value): self._data[self._getslice(i)] = self._struct.pack(*value) def __delitem__(self, i): del self._data[self._getslice(i)] def __iter__(self): i = 0 while i < len(self._data): yield self._struct.unpack(self._data[i: i + self._size]) i += self._size def __reversed__(self): if len(self._data) % self._size: raise ValueError() for i in range(len(self._data), 0, -self._size): yield self._struct.unpack(self._data[i - self._size: i]) def insert(self, i, item): self._data.insert(i * self._size, item) def _getslice(self, i): return slice(i * self._size, (i + 1) * self._size)