Python Language Décorateur avec des arguments (usine de décorateur)


Exemple

Un décorateur ne prend qu'un argument: la fonction à décorer. Il n'y a aucun moyen de passer d'autres arguments.

Mais des arguments supplémentaires sont souvent souhaités. L'astuce consiste alors à créer une fonction qui prend des arguments arbitraires et renvoie un décorateur.

Fonctions de décorateur

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

Le décorateur veut vous dire: Hello World

Note importante:

Avec de telles usines de décoration, vous devez appeler le décorateur avec une paire de parenthèses:

@decoratorfactory # Without parentheses
def test():
    pass

test()

TypeError: decorator () manquant 1 argument positionnel requis: 'func'

Cours de décorateur

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

À l'intérieur du décorateur avec des arguments (10,)