3

デコレーターと「複合ステートメント」に関する公式の Python ドキュメントのこのページでは、次のコードのサンプルが提供されています。

【サンプル冒頭】

@f1(arg)
@f2
def func(): pass

次と同等です。

def func(): pass
func = f1(arg)(f2(func))

【サンプル終了】

しかし、「func = f1(arg)(f2(func))」がわかりません。私はこれまでにこのような電話を見たことがなく、それが何を意味するのかわかりません。異なる引数を使用した複数の呼び出しであり、括弧の各ペアには 1 つの引数 (最初の 'arg'、2​​ 番目の 'f2(func)') が含まれていますか、それとも何か他のものですか? デコレータを勉強するには、これを理解する必要があります。また、これは Python 2.7 で動作しますか? 私が参考にしたデコレーターのサイトの 1 つは、Python 3.2 に関するものでした。

4

3 に答える 3

2

このために知っておく必要があるのは、関数はファーストクラスのオブジェクトであるということです。sintstrsと同じように関数を渡すことができます。

f1関数を返すので、投稿した内容は次のようになります。

def func(): pass
f1_ret = f1(arg)
f2_ret = f2(func)
func = f1_ret(f2_ret)
于 2012-05-08T20:08:21.997 に答える
1

Python 関数呼び出しの結果は、他の値と同じです。func = f1(arg)(f2(func))必要に応じて、次のように書くことができます

def func(): pass
x = f2(func)
y = f1(arg)
func = y(x)
于 2012-05-08T20:08:41.263 に答える
1

引数を取るデコレーターは、実際の装飾を行う関数を返さなければなりません。を呼び出し@f1(arg)ますf1(arg)。通常の表記f1を使用して呼び出すことができる関数を返します。2 番目の括弧には何が入りますか? 関数が装飾されています。これは、2 番目のデコレータによるものです。したがって、すべてをまとめると、 になります。(...)f1(arg)(...)f2(func)f1(arg)(f2(func))

欠けている部分f1は、関数を返すことと、2 番目の括弧のセットが返された関数を呼び出していることです。

于 2012-05-08T20:08:50.773 に答える