| 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()) |
|
|