2017-09-08 1 views
1
def myfunc(): 
    print(" myfunc() called.") 
    return 'ok' 

La valeur 'ok' était la valeur renvoyée par la fonction.La valeur renvoyée par la fonction est perdue après la décoration par une autre fonction

>>> myfunc() 
myfunc() called. 
'ok' 

Maintenant, pour le décorer avec une autre fonction. La fonction décorer.

def deco(func): 
    def _deco(): 
     print("before myfunc() called.") 
     func() 
     print(" after myfunc() called.") 
    return _deco 

Pour décorer myfunc avec la fonction déco.

@deco 
def myfunc(): 
    print(" myfunc() called.") 
    return 'ok' 

>>> myfunc() 
before myfunc() called. 
myfunc() called. 
    after myfunc() called. 

Pourquoi le résultat n'est pas le suivant?

>>> myfunc() 
before myfunc() called. 
myfunc() called. 
'ok' 
    after myfunc() called. 

Répondre

1

Si vous appelez la fonction myfunc undecorated dans la coquille, elle imprime automatiquement la valeur retournée. Après la décoration, myfunc est défini sur la fonction _deco qui renvoie uniquement None implicitement et n'imprime pas la valeur renvoyée de myfunc, donc 'ok' n'apparaît plus dans le shell.

Si vous souhaitez imprimer 'ok', vous devez le faire dans la fonction _deco:

def deco(func): 
    def _deco(): 
     print("before myfunc() called.") 
     returned_value = func() 
     print(returned_value) 
     print(" after myfunc() called.") 
    return _deco 

Et si vous voulez retourner la valeur que vous devez retourner à partir _deco:

def deco(func): 
    def _deco(): 
     print("before myfunc() called.") 
     returned_value = func() 
     print(" after myfunc() called.") 
     return returned_value 
    return _deco