2017-09-26 4 views
0

私はデコレータとラッパーを実験しています。私は理解できないデコレータの動作を見つけました。pythonデコレータとラッパー関数debug

def decorator_function(original_function): 
    def wrapper_function(): 
     print "wrapper is executed before {}".format(original_function.__name__) 
     return original_function() # Try it without() 
    return wrapper_function 

@decorator_function 
def display(): 
    print("display function ran!") 

私は機能の上に実行します。

In [59]: display() 
wrapper is executed before display 
display function ran! 

私はラッパーの外の印刷機能を移動するときしかし、ラッパーがまったく実行されませんようです。 (おそらくそれは走ったが、私は証拠が表示されません。)

def decorator_function(original_function): 
    def wrapper_function(): 
     #print "wrapper is executed before {}".format(original_function.__name__) 
     return original_function() # Try it without() 
    print "wrapper is executed before {}".format(original_function.__name__)  
    return wrapper_function 

@decorator_function 
def display(): 
    print("display function ran!") 

その後、私は見ていない「ラッパーが前に実行された...」もう。どうして? 私はここで何が欠けていますか?ときにコード負荷ときにコード実行ラッパーの実行中

In [63]: display() 
display function ran! 

答えて

1

デコレータは、実行されます。私は、ファイルexample.pyにあなたの第二の例をダンプし、このようにそれを実行した場合:

pythohn -i example.py 

私は、次を参照してください。

デコレータランニングた
wrapper is executed before display 
>>> 

。私はdisplay()を呼び出す場合今、私はその関数からの出力を参照してください。

>>> display() 
display function ran! 
>>> 

それはすでにを走ったので、私はここにデコレータからの出力が表示されません。

+0

より正確には、 'display'が定義されたとき(' decorator_function'が実際に実行されているとき)に、「ラッパーが実行されました」が出力されます。 – chepner

関連する問題