4

「ネストされたpythonデコレータ?」この質問を述べる正しい方法です。そうでない場合はお知らせください。

とにかく、私は udacity でクラスを受講していて、python デコレータが関与し、ブードゥー教の魔法のように見えるコードに遭遇したので、そのコードを理解できるかどうかを確認するために一般化された質問をしたいと思います。

次のコードがあるとします。

def A(f):
    print 'blah'
    return f

@A
def B(f):
    return f

@B
def C():
    pass

これで、上記のコードから、デコレータによって B が次のようになることがわかりました。

B = A(B)

それがデコレータの役割です。しかし、Cはどのようなものですか?私が見たいくつかの小さなサンプル コードから、A が B を変更し、B が C を変更するため、どういうわけか C が A の影響を受けます。しかし、これを理解するには 2 つの問題があります。

  1. C の正確なC = A(B)(C)性質C = A(B(C))
  2. C が実際に A の影響を受けている場合、上記のコードを実行したときに 'blah' が 1 回しか出力されないのはなぜですか?

個人的な推測

実際、私はそれを入力したので、最初に get: B = A(B)を取得し、次に C = B(C). これは、全体として が得られることを意味し、C = A(B)(C)「何とか」が一度だけ出力される理由を説明します。

しかし、私が確認するのが最善です。

4

1 に答える 1

6

あなたの個人的な推測は正しいです。

@デコレータは、 -line とそれに続く関数定義が評価される定義時に「呼び出され」ます。

@foo
def bar():
    pass

は単なる構文糖衣です...

def bar():
    pass
bar = foo(bar)
于 2012-06-27T03:58:16.493 に答える