32 lines
692 B
Python
32 lines
692 B
Python
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
|