You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.5 KiB
47 lines
1.5 KiB
"""
|
|
Cheap dataclasses module backport
|
|
|
|
Check out the official documentation to see what this is trying to
|
|
achieve:
|
|
https://docs.python.org/3/library/dataclasses.html
|
|
"""
|
|
|
|
import collections
|
|
import copy
|
|
|
|
class DataclsBase:
|
|
def __init__(self, **kwargs):
|
|
for name, value in self._defaults.items():
|
|
if name in kwargs:
|
|
value = kwargs[name]
|
|
setattr(self, name, copy.copy(value))
|
|
|
|
def __iter__(self):
|
|
for name in self.__annotations__:
|
|
yield (name, getattr(self, name))
|
|
|
|
def __repr__(self):
|
|
return "{}({})".format(
|
|
self.__class__.__name__,
|
|
", ".join(name + "=" + repr(value) for name, value in self))
|
|
|
|
class DataclsMeta(type):
|
|
def __new__(cls, name, bases, prop):
|
|
values = collections.OrderedDict()
|
|
for member_name in prop["__annotations__"].keys():
|
|
# Check if member has a default value set as class variable
|
|
if member_name in prop:
|
|
# Store default value and remove the class variable
|
|
values[member_name] = prop[member_name]
|
|
del prop[member_name]
|
|
else:
|
|
# Set None as the default value
|
|
values[member_name] = None
|
|
|
|
prop["__slots__"] = list(values.keys())
|
|
prop["_defaults"] = values
|
|
bases = (DataclsBase, *bases)
|
|
return super().__new__(cls, name, bases, prop)
|
|
|
|
def __prepare__(self, *args, **kwargs):
|
|
return collections.OrderedDict()
|
|
|