|
- # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
- class Registry(object):
- """
- The registry that provides name -> object mapping, to support third-party users' custom modules.
-
- To create a registry (inside detectron2):
-
- .. 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):
- """
- Args:
- name (str): the name of this registry
- """
- self._name = name
-
- self._obj_map = {}
-
- def _do_register(self, name, obj):
- 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=None):
- """
- 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:
- # used as a decorator
- def deco(func_or_class):
- name = func_or_class.__name__
- self._do_register(name, func_or_class)
- return func_or_class
-
- return deco
-
- # used as a function call
- name = obj.__name__
- self._do_register(name, obj)
-
- def get(self, name):
- ret = self._obj_map.get(name)
- if ret is None:
- raise KeyError("No object named '{}' found in '{}' registry!".format(name, self._name))
- return ret
|