Python Language Decoratore con argomenti (fabbrica di decorazioni)


Esempio

Un decoratore accetta un solo argomento: la funzione da decorare. Non c'è modo di passare altri argomenti.

Ma spesso si desiderano ulteriori argomenti. Il trucco è quindi di creare una funzione che accetta argomenti arbitrari e restituisce un decoratore.

Funzioni del decoratore

def decoratorfactory(message):
    def decorator(func):
        def wrapped_func(*args, **kwargs):
            print('The decorator wants to tell you: {}'.format(message))
            return func(*args, **kwargs)
        return wrapped_func
    return decorator

@decoratorfactory('Hello World')
def test():
    pass

test()

L'arredatore vuole dirti: Hello World

Nota importante:

Con queste fabbriche di decoratori devi chiamare il decoratore con una coppia di parentesi:

@decoratorfactory # Without parentheses
def test():
    pass

test()

TypeError: decorator () mancante 1 argomento posizionale richiesto: 'func'

Lezioni di decoratore

def decoratorfactory(*decorator_args, **decorator_kwargs):
    
    class Decorator(object):
        def __init__(self, func):
            self.func = func

        def __call__(self, *args, **kwargs):
            print('Inside the decorator with arguments {}'.format(decorator_args))
            return self.func(*args, **kwargs)
        
    return Decorator

@decoratorfactory(10)
def test():
    pass

test()

All'interno del decoratore con argomenti (10,)