import warnings from typing import Callable class Registry: def __init__(self, managed_thing: str): """ Create a new registry. Args: managed_thing: A string describing what type of thing is managed by this registry. Will be used for warnings and errors, so it's a good idea to keep this string globally unique and easily understood. """ self.managed_thing = managed_thing self._registry = {} def register(self, name: str) -> Callable: def inner_wrapper(wrapped_class) -> Callable: if name in self._registry: warnings.warn(f"{self.managed_thing} with name '{name}' doubly registered, old class will be replaced.") self._registry[name] = wrapped_class return wrapped_class return inner_wrapper def get_by_name(self, name: str): """Get a managed thing by name.""" if name in self._registry: return self._registry[name] else: raise ValueError(f"{self.managed_thing} with name '{name}' unknown.") def get_all_names(self): """Get the list of things' names registered to this registry.""" return list(self._registry.keys())