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