stouputils.collections.registry module#

class Registry[source]#

Bases: dict[str, T], Generic

Dictionary that registers callables by decorator.

register(function: T, /) → T[source]#
register(
*,
name: str | None = None,
) → Callable[[T], T]

Register a callable by its own name or a custom name.

Python applies stacked decorators from bottom to top. Put register outermost when the registry should keep the fully decorated callable.

>>> FUNCS = Registry[Callable[[int], int]]()
>>> from stouputils import measure_time
>>> @FUNCS.register
... @measure_time(printer=lambda *args: None)
... def measured(value: int) -> int:
...     return value * 5
>>> FUNCS["measured"] is measured
True
>>> @FUNCS.register
... def double(value: int) -> int:
...     return value * 2
>>> @FUNCS.register()
... def triple(value: int) -> int:
...     return value * 3
>>> @FUNCS.register(name="quadruple")
... def multiply(value: int) -> int:
...     return value * 4
>>> sorted(FUNCS), FUNCS["double"](2), FUNCS["quadruple"](2)
(['double', 'measured', 'quadruple', 'triple'], 4, 8)
>>> @FUNCS.register(name="double")
... def another(value: int) -> int:
...     return value
Traceback (most recent call last):
...
KeyError: "The name 'double' is already registered."