py-scopes/scopes/shape.py

50 lines
1.3 KiB
Python

# scopes.shape
"""really abstract basic data shape definitions"""
from scopes.util import keywords as k
class Record:
headFields = () # to be defined by subclass
headFieldsAsKeywords = set()
defaultHeadValue = ''
def __init__(self, *headValues, data=None, **kw):
self.head = dict((k, self.defaultHeadValue) for k in self.headFields)
for k, v in kw.items():
self.set(k, v)
for ix, hv in enumerate(headValues):
self.set(self.headFields[ix], hv)
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.defaultHeadValue
elif attr in self.headFieldsAsKeywords:
value = k(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 f'<{self.__class__.__name__}: {self.headValues}, {self.data}>'
def asDict(self):
return dict(head=self.head, data=self.data)