Python Language Decorador con argumentos (decorador de fábrica).


Ejemplo

Un decorador toma solo un argumento: la función a decorar. No hay forma de pasar otros argumentos.

Pero a menudo se desean argumentos adicionales. El truco es, entonces, hacer una función que tome argumentos arbitrarios y devuelva un decorador.

Funciones de decorador

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()

El decorador quiere decirte: Hola Mundo.

Nota IMPORTANTE:

Con tales fábricas de decoradores debe llamar al decorador con un par de paréntesis:

@decoratorfactory # Without parentheses
def test():
    pass

test()

TypeError: decorator () falta 1 argumento posicional requerido: 'func'

Clases de decorador

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()

Dentro del decorador con argumentos (10,)