2016-10-11 84 views
0

私はこの簡単なコードを持っています。Pythonの関数を呼び出すときに関数が実行されないのはなぜですか?

def decor(func): 
    def wrap(): 
    print("============") 
    func() 
    print("============") 
    return wrap 

def print_text(): 
    print("Hello world!") 

decor(print_text()) 

なぜ「Hello world!」と表示されるのですか? 2つのラッパーではありませんか?ここで

+0

'print_text()'をコールして戻り値( 'None' btw。)をdecorの引数として渡すと(印刷が行われるとき)、' decor'を呼び出します。副作用)と__throw away__戻り値。返された値を放棄すると、目に見える副作用もありません。デコレータを使う正しい方法は 'print_text = decor(print_text)'です。その後、 'print_test()'を呼び出すことができます。 –

答えて

0

あなたは、単一の引数でdecorを呼び出しています。その引数はprint_text()が返すものです。さて、print_text()は何かを表示し、Noneを返します。今のところあなたの出力はHello world!です。現在はdecorには何も渡されず、wrap()関数を返します。どこにも実際にはwrap()が呼び出され、最終出力はちょうどHello world!です。

あなたはデコレータの使用を誤解しています。

def print_text(): 
    print("Hello world!") 

print_text = decor(print_text) 

今、あなたはそれが呼び出されているdecor(print_text)のリターン(wrap()機能)、およびすべてのものであることがわかります。このためのショートカットです

@decor 
def print_text(): 
    print("Hello world!") 

:正しい構文はこれです印刷されます。

+0

ありがとうございます。まだいくつかのことは不明です。私がdecor()を呼び出すと、自動的にwrap()も呼び出されません。なぜなら、それは装飾にネストされているからです。 – Fuad

+0

@Fuad:いいえ、それは機能を定義することだけです。 'print_text = decor(print_text)'の後に 'wrap()'を呼び出す 'print_text()'です。 – zondo

+0

ああ、入れ子になった関数を呼びたいときは、追加のカッコを使う必要がありますか?あなたが入れ子になっている関数の中に入れ子関数を持っている場合はどうしたらいいのですか?decor(arg)()()をしますか?ありがとうあなたの助けをたくさんいただきありがとうございました。大いに感謝します。 – Fuad

0

あなたはprint_text(したがって、印刷に「Hello World!」という)を評価し、decorに結果を渡している。

decor(print_text()) 

ここでは、decorprint_textを渡し、それが返す結果の関数を呼び出しています、 wrapである::最初のケースはdecorから返された関数を呼び出すしないこと

decor(print_text)() 

お知らせ。

decor(print_text())() 

TypeError: 'NoneType' object is not callable

funcは今Noneですので:それを呼び出すと何が起こるか見てみてください。

+0

マイケルありがとう。私が理解していないこと - 私は装飾(func)として装飾を定義しています。なぜ、print_text()で 'func'を置き換えると装飾が呼び出されないのですか?私はあなたの装飾(print_text())()、(print_text)を含むものと空のもう一つのもののように2組のかっこを必要とするのはなぜですか? – Fuad

+0

'decor' **は**呼び出されます。しかし、返される関数はそうではありません。 –

0

これは、関数wrapを返すだけなので、呼び出されません。結果を変数に代入するか、直接decor(print_text)()を使用して呼び出します。後者は関数自体の代わりに関数の結果をdecorに渡すので、print_textを使用し、print_text()を使用しないことに注意してください。作業バージョンは次のようになります。

def decor(func): 
    def wrap(): 
    print("============") 
    func() 
    print("============") 
    return wrap 

def print_text(): 
    print "Hello world!" 

wrapped_function = decor(print_text) 
wrapped_function() 
+0

ありがとう、Lolgast。私は現在、SoloLearnでPythonを学んでいます。コードはまったく同じようにコードを与えました。変数に最初に代入することなく、シバン全体をどのように印刷することができるのだろうかと思いました。以下の非常に単純なコードを見てください: 'def square(var): \t print(var ** 2)' square(2)は今印刷します4.同様の方法で、私は装飾print_text())は、最初にprint()を呼び出すwrap()を経由してdecorを呼び出します。 decorが呼び出されるので、ネストされたラップ関数も自動的に呼び出されることを意味しませんか? – Fuad

+0

いいえ。あなたのデコレート関数では、あなたは_define_をラップして返します。これは、デコレーションを定義したのと似ています。定義しますが、デコル(some_argument)を呼び出すまでは何も起こりません。 – Lolgast

+0

ありがとうございました! – Fuad

関連する問題