2017-10-15 4 views
-2

J'essaie de comprendre les décorateurs en python. Je ne comprends pas pourquoi ce qui suit ne fonctionne pas:Pourquoi ce décorateur python ne fonctionne-t-il pas?

def decorator(func): 
    def logger(*args, **kwargs): 
     print "start logging" 
     func(*args, **kwargs) 
     print "end logging" 
    return logger 

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

Si j'appelle add(2,3) la sortie sera:

start logging 
end logging 

Cependant, si je modifie mon code et écrire return func(*args, **kwargs) dans la définition de logger cela fonctionne mais end logging n'est pas écrit sur la sortie.

+3

Une fonction se termine lorsque vous 'return' ... Affectez le résultat de l'appel de la fonction, * puis * print, * puis * renvoyez ce résultat. – jonrsharpe

+1

La fonction 'logger' * doit * renvoyer la valeur de' func', mais elle ne peut pas le faire avant la fin. Maintenant, réfléchissez un peu, comment pourriez-vous enregistrer le résultat de l'appel 'func', afin de pouvoir le renvoyer plus tard? –

Répondre

4

Vous pouvez capture la valeur de retour dans une variable, et le retourner après l'impression:

def decorator(func): 
    def logger(*args, **kwargs): 
     print "start logging" 
     result = func(*args, **kwargs) 
     print "end logging" 
     return result 
    return logger 

Décorateurs ne sont pas spéciaux ici; c'est juste une fonction appelant une autre fonction.