2017-08-20 1 views
2

J'ai essayé d'utiliser des décorateurs de fonction, mais dans cet exemple, cela ne fonctionne pas pour moi, pouvez-vous me donner la solution?Python erreur de décorateur de fonction

def multiply_by_three(f): 
    def decorator(): 
     return f() * 3 
return decorator 

@multiply_by_three 
def add(a, b): 
    return a + b 

print(add(1,2)) # returns (1 + 2) * 3 = 9 

interprète erreur imprime: « TypeError: décorateur() prend 0 arguments de position, mais 2 ont reçu »

+2

Il dit la vérité. Votre fonction 'decorator' ne prend aucun argument, byt quand vous appelez' add (1,2) ', vous finissez par appeler' decorator (1,2) ', car c'est ce que vous renvoyez de votre méthode' multiply_by_three' . En outre, ne pas l'appeler "décorateur" parce que cela rendra très confus de discuter (puisque 'multiply_by_three' est le décorateur actuel). – larsks

Répondre

4

Lorsque vous utilisez un décorateur, la fonction que vous revenez du décorateur remplace l'ancienne fonction. En d'autres termes, la fonction decorator dans multiply_by_three remplace la fonction add.

Cela signifie que chaque signature de fonction doit correspondre, y compris ses arguments. Cependant, dans votre code add prend deux arguments tandis que decorator n'en prend aucun. Vous devez également laisser decorator recevoir deux arguments. Vous pouvez le faire facilement en utilisant *args and **kwargs:

def multiply_by_three(f): 
    def decorator(*args, **kwargs): 
     return f(*args, **kwargs) * 3 
    return decorator 

Si vous décorez maintenant votre fonction et l'exécuter, vous pouvez voir cela fonctionne:

@multiply_by_three 
def add(a, b): 
    return a + b 

print(add(1,2)) # 9