私は、以下のリンクからPythonでデコレータの概念を学んでいた。Pythonのデコレータは、どのように関数を生成しますか?
http://www.python-course.eu/python3_decorators.php
私はそれで次のコードスニペットのための基本的な疑問があります。このページで
def f(x):
def g(y):
return y + x + 3
return g
nf1 = f(1)
nf2 = f(3)
print(nf1(1))
print(nf2(1))
を、それは最後の2つのラインの出力がそれぞれ「5」および「7」になると書かれている。 しかし私が見ることができるように、私たちは 'x'の値を渡すだけです、どこから 'y'の値を取得しますか?どのように出力を計算するために 'Y'に値を割り当てるのですか?
これはデコレータではなく、クロージャです。デコレータは引数として*関数*を取り、入力に基づいて新しい関数を返します。クロージャは、(大まかに)それが定義されているスコープ内のローカル変数の値を「覚えている」関数です。 2つの概念は、デコレータがしばしば元の関数を呼び出すクロージャを返すという点で関連しています。 – chepner
つまり、 'g'はクロージャであり、' f'は単にクロージャを返す関数です。 – chepner