Skip to content

registry

util.registry

클래스 레지스트리를 가질 수 있도록 하는 추상 클래스를 정의합니다.

Registerable

Bases: ABC

Abstract class for base module classes which have class registry.

Usage
from __future__ import annotations
from typing import Dict
from .SaigeToolkit.SaigeToolkit.util.registry import Registerable


class BaseModule(Registerable):
    registry: Dict[str, BaseModule]


class ImplementedModuleA(BaseModule):
    pass


class ImplementedModuleB(BaseModule):
    pass


print(BaseModule.registry)
# output
# {'ImplementedModuleA': __main__.ImplementedModuleA,
#  'ImplementedModuleB': __main__.ImplementedModuleB}

If you want use arbitrary key for registering,

class BaseModule2(Registerable):
    registry: Dict[str, BaseModule2]


class ImplementedModule2A(BaseModule2, key="module_2_a"):
    pass


print(BaseModule2.registry)
# output
# {'module_2_a': __main__.ImplementedModule2A}

or, define "init_subclass" again.

class BaseModule3(Registerable):
    registry: Dict[str, BaseModule3]

   def __init_subclass__(cls):
       super().__init_subclass__(key=cls.__name__.lower())

class ImplementedModule3A(BaseModule3):
    pass


print(BaseModule3.registry)
# output
# {'implementedmodule3a': __main__.ImplementedModule3A}

registry abstractmethod property

registry: Dict[str, Registerable]

__init_subclass__

__init_subclass__(key=None, **kwargs) -> None
Source code in SaigeToolkit/util/registry.py
def __init_subclass__(cls, key=None, **kwargs) -> None:
    if isinstance(cls.registry, property):
        cls.registry = {}
    else:
        if key is None:
            key = cls.__name__

        if key in cls.registry:
            raise AlreadlyRegisteredClassError
        cls.registry[key] = cls