def cell_array_generator(self, key): """Generator traversing cells specified in key Parameters ---------- key: Iterable of Integer or slice \tThe key specifies the cell keys of the generator """ for i, key_ele in enumerate(key): # Get first element of key that is a slice if type(key_ele) is SliceType: slc_keys = slice_range(key_ele, self.dict_grid.shape[i]) key_list = list(key) key_list[i] = None has_subslice = any(type(ele) is SliceType for ele in key_list) for slc_key in slc_keys: key_list[i] = slc_key if has_subslice: # If there is a slice left yield generator yield self.cell_array_generator(key_list) else: # No slices? Yield value yield self[tuple(key_list)] break
def __setitem__(self, key, value): """Accepts index and slice keys""" single_keys_per_dim = [] for axis, key_ele in enumerate(key): if is_slice_like(key_ele): # We have something slice-like here single_keys_per_dim.append(slice_range(key_ele, length = key[axis])) elif is_string_like(key_ele): # We have something string-like here raise NotImplementedError else: # key_ele is a single cell single_keys_per_dim.append((key_ele, )) single_keys = product(*single_keys_per_dim) unredo_mark = False for single_key in single_keys: if value: # UnRedo support old_value = self(key) # We seem to have double calls on __setitem__ # This hack catches them if old_value != value: unredo_mark = True undo_operation = (self.__setitem__, [key, old_value]) redo_operation = (self.__setitem__, [key, value]) self.unredo.append(undo_operation, redo_operation) # End UnRedo support self.dict_grid[single_key] = value else: # Value is empty --> delete cell try: self.dict_grid.pop(key) except (KeyError, TypeError): pass if unredo_mark: self.unredo.mark()