1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
from collections.abc import Mapping
from typing import Any
__REGISTRY: Mapping[str, Any] = vars()
class _Synthetic:
def __reduce__(self):
return (
synthesize(type(self).__name__, type(self).__bases__),
(),
vars(self),
)
def synthesize(name, bases):
typename = f'{__name__}.{name}'
if not isinstance(bases, tuple):
bases = (bases,)
if _Synthetic not in bases:
bases += (_Synthetic,)
constructor = __REGISTRY.get(typename)
if not constructor:
constructor = type(name, bases, {})
typename = constructor.__name__
__REGISTRY[typename] = constructor
return constructor
|