## Wrapper to handle some sort of record baseclass class RecordHandler: """ handler for a record type defines how a record can be created, and how to retrieve all field names, and the required ones. """ @classmethod def wrap(cls, klass): return cls(klass) def __init__(self, klass): self.klass = klass def create(self, **kwargs): return self.klass(**kwargs) def get_field_names(self): return self.klass.__dict__.keys() @property def record(self): return self.klass @property def required_arguments(self): return self.get_field_names() class RecordDictHandler(RecordHandler): """ RecordHandler that outputs a dictionary """ def __init__(self, klass=None): # it is not required to define dict, but you could do OrderedDict e.g. self.klass = klass or dict def get_field_names(self): # dictionary has no required fields. return [] class RecordDataclassHandler(RecordHandler): """ handles dataclasses.dataclass derivatives """ def create(self, **kwargs): # clean field names to be only valid if they are on the dataclass. record_fields = self.get_field_names() kwargs = {k: v for k, v in kwargs.items() if k in record_fields} return self.klass(**kwargs) def get_field_names(self): return list(self.klass.__dataclass_fields__.keys()) # @TODO: namedtuple - dynamic generation? # @TODO: RecordPydanticHAndler # @TODO: RecordAttrsHandler