File size: 1,432 Bytes
749745d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.


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. creeting 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_modeul_nickname")

        def foo():

            ...



    Access of module is just like using a dictionary, eg:

        f = some_registry["foo_modeul"]

    """

    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