2016-07-03 6 views
1

私は最近、Pythonのデコレータの対象をleant、そして下の2つの異なるプログラムのための奇妙な何かを見つけた:Pythonの関数デコレータパズル

例1:

def deco(func): 
    def inner(): 
     print("Running inner") 
    return func 

@deco 
def target(): 
    print("Running target") 

def main(): 
    print("Running main()") 
    target() 

if __name__ == "__main__": 
    main() 

例2:

def deco(func): 
    print("Running inner") 
    return func 

@deco 
def target(): 
    print("Running target") 

def main(): 
    print("Running main()") 
    target() 

if __name__ == "__main__": 
    main() 

Example1とExample2を実行すると、2つの異なる結果が得られます。

Running main() 
Running target 
例1で

、および例2で

Running inner 
Running main() 
Running target 

例1では「Running inner」が失われているようです。どうして?

+1

例1と例2の出力を混同しませんでしたか? –

+0

私の間違いをお詫び申し上げます。 – CHENLU

答えて

4

実行例2は、定義時にdecoが実行され、その例ではすぐにinnerが出力されるため、その結果が表示されます。

inner funcで何もしないので、例1ではインナーが印刷されません。あなたのデコレータはinnerで、funcではありません。あなたはデコレータに期待するものです

Running main() 
Running inner 
Running target 

:あなたがこれを行うと

def deco(func): 
    def inner(): 
     print("Running inner") 
     func() 
    return inner # note change here 

は、あなたがこのような結果を得るでしょう:とinner自体は、FUNCを呼び出す必要があります。

+0

既に変更されているのは、func自体を返したため、内部関数がExample1で実行されなかったためです。右? – CHENLU

+0

はい。何もそれを呼んでいない。 –