Source code for chemprop.utils.registry

import inspect
from typing import Any, Iterable, Type, TypeVar

T = TypeVar("T")


[docs] class ClassRegistry(dict[str, Type[T]]):
[docs] def register(self, alias: Any | Iterable[Any] | None = None): def decorator(cls): if alias is None: keys = [cls.__name__.lower()] elif isinstance(alias, str): keys = [alias] else: keys = alias cls.alias = keys[0] for k in keys: self[k] = cls return cls return decorator
__call__ = register
[docs] def __repr__(self) -> str: # pragma: no cover return f"{self.__class__.__name__}: {super().__repr__()}"
[docs] def __str__(self) -> str: # pragma: no cover INDENT = 4 items = [f"{' ' * INDENT}{repr(k)}: {repr(v)}" for k, v in self.items()] return "\n".join([f"{self.__class__.__name__} {'{'}", ",\n".join(items), "}"])
[docs] class Factory:
[docs] @classmethod def build(cls, clz_T: Type[T], *args, **kwargs) -> T: if not inspect.isclass(clz_T): raise TypeError(f"Expected a class type! got: {type(clz_T)}") sig = inspect.signature(clz_T) kwargs = {k: v for k, v in kwargs.items() if k in sig.parameters.keys()} return clz_T(*args, **kwargs)