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]) Callable[source]
Decorator for decorator, make a decorator function with keyword-arguments usable as the real python decorator.
This utility allows decorators with parameters to be used both as simple decorators (without parentheses) and as parameterized decorators (with parentheses and arguments).
- Parameters:
deco (Callable[..., Callable]) – Decorator function to be decorated. The first parameter should be the function to be decorated, followed by optional keyword arguments.
- Returns:
A new decorator that can be used with or without parameters.
- Return type:
Callable
Tip
This decorator can be useful when building a decorator with parameters.
Note
In the decorated decorator, only keyword arguments are supported. So make sure the original decorator function’s parameters (except
func) are all keyword supported, and do not try to use positional arguments when using it to decorate another function.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