hbutils.design.decorator

Overview:

Some useful utilities for decorator pattern and python decorators for function or class.

decolize

hbutils.design.decorator.decolize(deco: Callable[[], Callable])[source]
Overview:

Decorator for decorator, make a decorator function with keyword-arguments usable as the real python decorator.

Arguments:
  • deco (Callable[..., Callable]): Decorator function to be decorated.

Examples:

>>> from functools import wraps
>>> @decolize  # decorate the decorator
... def deco(func, a=1, b=2):
...     @wraps(func)
...     def _new_func(*args, **kwargs):
...         return func(*args, **kwargs) * a + b
...
...     return _new_func

>>> @deco  # used as simple decorator, same as deco(_func_1)
>>> def _func_1(a, b, c):
...     return (a + b * 2) * c

>>> @deco(a=2)  # used as parameterized decorator, same as deco(_func_2, a=2)
>>> def _func_2(a, b, c):
...     return (a + b * 2) * c

>>> _func_1(1, 2, 3)
17  # ((1 + 2 * 2) * 3) * 1 + 2 == 17
>>> _func_2(1, 2, 3)
32  # ((1 + 2 * 2) * 3) * 2 + 2 == 32

Tip

This decorator can be useful when build a decorator with parameters.

Note

In the decorated decorator, only keyword arguments are supported. So make sure the original decorator function’s parameter (except func) are all keyword supported, and do not try to use positional arguments when use it to decorator another function.