|
|
|
__all__ = ['Registry', 'build_from_cfg'] |
|
|
|
class Registry(object): |
|
"""A registry to map strings to classes. |
|
|
|
Args: |
|
name (str): Registry name. |
|
""" |
|
|
|
def __init__(self, name): |
|
self._name = name |
|
self._obj_dict = dict() |
|
|
|
def __repr__(self): |
|
format_str = self.__class__.__name__ + '(name={}, items={})'.format( |
|
self._name, self.items()) |
|
return format_str |
|
|
|
@property |
|
def name(self): |
|
return self._name |
|
|
|
@property |
|
def obj_dict(self): |
|
return self._obj_dict |
|
|
|
def get(self, key): |
|
return self._obj_dict.get(key, None) |
|
|
|
def has(self, key): |
|
if key in self._obj_dict.keys(): |
|
return True |
|
return False |
|
|
|
def items(self): |
|
return list(self._obj_dict.keys()) |
|
|
|
def _register_obj(self, obj): |
|
"""Register a object. |
|
|
|
Args: |
|
obj (:obj: callable): Callable object to be registered. |
|
""" |
|
if not callable(obj): |
|
raise TypeError(f'object {str(obj)} must be callable') |
|
obj_name = obj.__name__ |
|
if obj_name in self._obj_dict: |
|
raise KeyError(f'{obj_name} is already registered in {self.name}.') |
|
self._obj_dict[obj_name] = obj |
|
|
|
def register_obj(self, obj): |
|
self._register_obj(obj) |
|
return obj |
|
|
|
|
|
def build_from_cfg(name, cfg, registry, default_args=None): |
|
"""Build a module from config dict. |
|
Since Cruise Module has different config format with haggs, we will |
|
try to detect and catch Cruise usage in the begining. |
|
|
|
Args: |
|
name (str): Name of the object |
|
cfg (addict): Config dict of the object |
|
registry (:obj:`Registry`): The registry to search the type from. |
|
default_args (dict, optional): Default initialization arguments. |
|
|
|
Returns: |
|
obj: The constructed object. |
|
""" |
|
obj = registry.get(name) |
|
if obj is None: |
|
raise KeyError(f'{name} is not in the {registry.name} registry. ' |
|
f'Choose among {list(registry.obj_dict.keys())}') |
|
|
|
if default_args is not None: |
|
|
|
|
|
|
|
cfg.external_args = default_args |
|
|
|
return obj(cfg) |