构造dict类添加model list

 笔者再看DSSD的过程中,发现原来dict还可以这样扩展,特此记录一下。

单纯的摘选涉及到dict扩展的内容:

def _register_generic(module_dict, module_name, module):
    assert module_name not in module_dict
    module_dict[module_name] = module


class Registry(dict):
    """
    A helper class for managing registering modules, it extends a dictionary
    and provides a register functions.
    Eg. creating a registry:
        some_registry = Registry({"default": default_module})
    There're two ways of registering new modules:
    1): normal way is just calling register function:
        def foo():
            ...
        some_registry.register("foo_module", foo)
    2): used as decorator when declaring the module:
        @some_registry.register("foo_module")
        @some_registry.register("foo_module_nickname")
        def foo():
            ...
    Access of module is just like using a dictionary, eg:
        f = some_registry["foo_module"]
    """

    def __init__(self, *args, **kwargs):
        super(Registry, self).__init__(*args, **kwargs)

    def register(self, module_name, module=None):
        # used as function call
        if module is not None:
            _register_generic(self, module_name, module)
            return

        # used as decorator
        def register_fn(fn):
            _register_generic(self, module_name, fn)
            return fn

        return register_fn

  其实fn代表添加的model list,这里我才用添加匿名函数作为示例:

# Eg. creating a registry:
some_registry = Registry({"default": lambda x:x*2})
print(some_registry)
some_registry.register("foo_module", lambda x:x*3)
print(some_registry)
@some_registry.register("foo_module_nickname")
def foo(x):
    return x*4

print(some_registry)
print(some_registry["default"](3))

posted @ 2021-06-04 20:01  为红颜  阅读(118)  评论(0编辑  收藏  举报