def __getitem__(self, key): """Adds slicing access to cell code retrieval The cells are returned as a generator of generators, of ... of unicode. Parameters ---------- key: n-tuple of integer or slice \tKeys of the cell code that is returned Note ---- Classical Excel type addressing (A$1, ...) may be added here """ for key_ele in key: if isslice(key_ele): # We have something slice-like here return self.cell_array_generator(key) elif isstring(key_ele): # We have something string-like here msg = "Cell string based access not implemented" raise NotImplementedError(msg) # key_ele should be a single cell return self.dict_grid[key]
def __setitem__(self, key, value): """Accepts index and slice keys Parameters ---------- key: 3-tuple of Integer or Slice object \tCell key(s) that shall be set value: Object (should be Unicode or similar) \tCode for cell(s) to be set """ single_keys_per_dim = [] for axis, key_ele in enumerate(key): if isslice(key_ele): # We have something slice-like here length = key[axis] slice_range = range(*key_ele.indices(length)) single_keys_per_dim.append(slice_range) elif isstring(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) for single_key in single_keys: if value: # Never change merged cells merging_cell = \ self.cell_attributes.get_merging_cell(single_key) if merging_cell is None or merging_cell == single_key: self.dict_grid[single_key] = value else: # Value is empty --> delete cell try: self.pop(key) except (KeyError, TypeError): pass
def _make_nested_list(self, gen): """Makes nested list from generator for creating numpy.array""" res = [] for ele in gen: if ele is None: res.append(None) elif not isstring(ele) and isgenerator(ele): # Nested generator res.append(self._make_nested_list(ele)) else: res.append(ele) return res