52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
from typing import Dict, Any, Callable
|
|
|
|
|
|
class ClassRegistry(MutableMapping[str, Callable]):
|
|
|
|
def check_key(self, key: str) -> None:
|
|
pass
|
|
|
|
def check_value(self, value: Callable) -> None:
|
|
pass
|
|
|
|
def check(self, key: str, value: Callable) -> None:
|
|
try:
|
|
self.check_key(key)
|
|
except KeyError:
|
|
raise
|
|
except Exception as e:
|
|
raise KeyError(str(e))
|
|
|
|
try:
|
|
self.check_value(value)
|
|
except ValueError:
|
|
raise
|
|
except Exception as e:
|
|
raise ValueError(str(e))
|
|
|
|
def register(self, key: str, value: Callable) -> None:
|
|
self[key] = value
|
|
|
|
def unregister(self, key: str) -> None:
|
|
del self[key]
|
|
|
|
def __setitem__(self, key: str, value: Callable) -> None:
|
|
self.check(key, value)
|
|
super().__setitem__(key, value)
|
|
|
|
def metaclass(self) -> type:
|
|
class RegistryMetaclass(type):
|
|
|
|
def __new__(cls,
|
|
name: str,
|
|
*args: Any,
|
|
register: bool = True,
|
|
key: Optional[str] = None,
|
|
**kwargs: Any) -> type:
|
|
newclass = super().__new__(cls, name, *args, **kwargs)
|
|
if register:
|
|
self.register(key or name, newclass)
|
|
return newclass
|
|
|
|
return RegistryMetaclass
|