# scopes.shape """really abstract basic data shape definitions""" class Record: headFields = [] # to be defined by subclass def __init__(self, *headValues, data=None, **kw): self.head = {} for k, v in kw.items(): if k in self.headFields: self.head[k] = kw.pop(k) for ix, hv in enumerate(headValues): self.head[self.headFields[ix]] = hv for k in self.headFields: if self.head.get(k) is None: self.head[k] = '' setattr(self, k, self.head[k]) self.data = data or {} @property def headValues(self): return [self.head[k] for k in self.headFields] def set(self, attr, value): if attr in self.headFields: if value is None: value = '' self.head[attr] = value setattr(self, attr, value) else: raise AttributeError(attr) def update(self, data, overwrite=False): if data is None: return if overwrite: self.data = data else: self.data.update(data) def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self.asDict()) def asDict(self): return dict(head=self.head, data=self.data)