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

'ok'は関数の戻り値です。関数の戻り値が他の関数によって修飾された後に失われる

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

他の機能でこれを飾るようになりました。 decorate関数です。

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

デコ機能でmyfuncをデコレートします。

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

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

結果が次のようなものではないのはなぜですか?

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

答えて

1

あなたはシェルで装飾のないmyfunc関数を呼び出す場合は、自動的に返された値を出力します。デコレーション後、myfuncは暗黙的にNoneを返す_deco関数に設定され、戻り値myfuncが出力されないため、シェルには'ok'が表示されなくなりました。

あなたが'ok'を印刷したい場合は、あなたが_deco機能でそれをしなければならない。

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

そして、あなたが値を返すようにしたい場合は、_decoからそれを返す必要があります:

def deco(func): 
    def _deco(): 
     print("before myfunc() called.") 
     returned_value = func() 
     print(" after myfunc() called.") 
     return returned_value 
    return _deco 
関連する問題