def __setattr__(self, name, value): if self.frozen: raise Enumeration.ConstError('Enumeration is frozen.') sd = self.__dict__ if name in sd: raise Enumeration.ConstError('Cannot rebind %s.' % name) i, desc = self._next_val, None if is_a_string(value): desc = value elif is_an_integer(value): i = value else: i, desc = value if self.unique and i in self._values: raise ValueError('Value already used: %d.' % i) sa = self._super_setattr sa(name, i) self._names.add(name) self._values.add(i) sa('_next_val', i + 1) if desc: sdd = self._descriptions sdd[name] = desc sdd[i] = desc
def __getitem__(self, key): if is_an_integer(key): for sec in self.section: if key >= sec.start_addr and key <= sec.end_addr: key -= sec.start_addr return sec.buffer[key] else: start = key.start if start is None: raise IndexError('Must give start index.') stop = key.stop for sec in self.section: if start >= sec.start_addr and start <= sec.end_addr: start -= sec.start_addr if stop is not None: stop -= sec.start_addr return sec.buffer[slice(start, stop, key.step)] raise IndexError('Given index is invalid.')
def _serialize(self, f, name, val): if is_an_integer(val): f.write('^i %s %d\n' % (name, val)) elif isinstance(val, str): f.write('^b %s %d\n' % (name, len(val))) f.write(val) elif isinstance(val, list): f.write('^a %s %d\n' % (name, len(val))) for i, e in enumerate(val): self._serialize(f, str(i), e) elif isinstance(val, dict): f.write('^h %s %d\n' % (name, len(val))) keys = val.keys() keys.sort() for i, k in enumerate(keys): ks = str(i) self._serialize(f, ks, k) self._serialize(f, ks, val[k]) elif isinstance(val, float): hexflt = val.hex() f.write('^f %s %d\n' % (name, len(hexflt))) f.write(hexflt) else: raise ValueError("Can't serialize %s, %s." % (name, type(val)))