| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | from typing import Any, Dict, Iterable, Iterator, Tuple
|
| |
|
| | from tabulate import tabulate
|
| |
|
| |
|
| | class Registry(Iterable[Tuple[str, Any]]):
|
| | """
|
| | The registry that provides name -> object mapping, to support third-party
|
| | users' custom modules.
|
| |
|
| | To create a registry (e.g. a backbone registry):
|
| |
|
| | .. code-block:: python
|
| |
|
| | BACKBONE_REGISTRY = Registry('BACKBONE')
|
| |
|
| | To register an object:
|
| |
|
| | .. code-block:: python
|
| |
|
| | @BACKBONE_REGISTRY.register()
|
| | class MyBackbone():
|
| | ...
|
| |
|
| | Or:
|
| |
|
| | .. code-block:: python
|
| |
|
| | BACKBONE_REGISTRY.register(MyBackbone)
|
| | """
|
| |
|
| | def __init__(self, name: str) -> None:
|
| | """
|
| | Args:
|
| | name (str): the name of this registry
|
| | """
|
| | self._name: str = name
|
| | self._obj_map: Dict[str, Any] = {}
|
| |
|
| | def _do_register(self, name: str, obj: Any) -> None:
|
| | assert (
|
| | name not in self._obj_map
|
| | ), "An object named '{}' was already registered in '{}' registry!".format(
|
| | name, self._name
|
| | )
|
| | self._obj_map[name] = obj
|
| |
|
| | def register(self, obj: Any = None) -> Any:
|
| | """
|
| | Register the given object under the the name `obj.__name__`.
|
| | Can be used as either a decorator or not. See docstring of this class
|
| | for usage.
|
| | """
|
| | if obj is None:
|
| |
|
| | def deco(func_or_class: Any) -> Any:
|
| | name = func_or_class.__name__
|
| | self._do_register(name, func_or_class)
|
| | return func_or_class
|
| |
|
| | return deco
|
| |
|
| |
|
| | name = obj.__name__
|
| | self._do_register(name, obj)
|
| |
|
| | def get(self, name: str) -> Any:
|
| | ret = self._obj_map.get(name)
|
| | if ret is None:
|
| | raise KeyError(
|
| | "No object named '{}' found in '{}' registry!".format(
|
| | name, self._name
|
| | )
|
| | )
|
| | return ret
|
| |
|
| | def __contains__(self, name: str) -> bool:
|
| | return name in self._obj_map
|
| |
|
| | def __repr__(self) -> str:
|
| | table_headers = ['Names', 'Objects']
|
| | table = tabulate(
|
| | self._obj_map.items(), headers=table_headers, tablefmt='fancy_grid'
|
| | )
|
| | return 'Registry of {}:\n'.format(self._name) + table
|
| |
|
| | def __iter__(self) -> Iterator[Tuple[str, Any]]:
|
| | return iter(self._obj_map.items())
|
| |
|
| |
|
| | __str__ = __repr__
|
| |
|