このwith_default_value
関数は、しばしば (不正確に) 「クロージャー」と呼ばれるものです (技術的には、クロージャーはむしろ返される内部関数です。here newfunc
-- たとえばhereを参照してください)。より一般的にwith_default_value
は、高階関数("HOF") です。関数 ( func
) を引数として取り、結果として関数 ( ) を返しますnewfunc
。
これをPythonのデコレータの概念と構造と混同する回答を見てきましたが、これは間違いなくそうfunc
ではありませんint
. デコレータも高階関数ですが、より具体的なものです: 関数引数の装飾された、つまり「強化された」バージョンを返すもの (これは唯一の引数でなければなりません -- 「引数を持つデコレータ」は、デコレーター HOF に複数の引数を与えるのではなく、関数/クロージャーの入れ子)、その関数引数とまったく同じ名前に再割り当てされます (したがって、通常は同じ署名を持ちます-そうでない場合、デコレーターを使用することは非常に困難です)独特、非慣用的、判読不能など)。
そのため、ケースとはまったく関係のないデコレーターは忘れて、newfunc
クロージャーに注目してください。字句的にネストされた関数は、囲んでいる関数のすべてのローカル変数名 (引数はローカル変数であるため、引数名を含む) を参照できます (ただし、再バインドはできません)。これがクロージャとして知られている理由です。これらを「閉じた」ものです。 「自由変数」。ここで、newfunc
参照できるfunc
とdefault
します。
高階関数は Python では非常に自然なことです。特に、関数はファーストクラスのオブジェクトであるため (そのため、関数を引数として渡したり、関数値として返したり、リストや他のコンテナーに格納したりするために特別なことをする必要はありません)。など)、関数と他の種類のオブジェクトの間に名前空間の区別はなく、関数が言及されているという理由だけで関数の自動呼び出しはありません。この種の多くの区別を引き出します)。Python では、関数について言及することは、まさに言及です。CALL は、関数オブジェクト (名前などで参照) の後に括弧が続く場合にのみ発生します。
この例にあるのはこれですべてです。質問を編集したり、ここにコメントしたりしてください。他に不明な点がある場合は、お気軽にコメントしてください。
編集:したがって、OPは「クロージャーファクトリー」の例をもっと求めて丁寧にコメントしました。これが 1 つです -- 抽象的な種類の GUI ツールキットを想像してみてください。
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
しかし、これは正しく機能しません。 isi
内lambda
で遅延バインドされているため、いずれかのボタンがクリックされるまでに、どのボタンがクリックされたかに関係なく、i
の値は常に最後のボタンのインデックスになります。さまざまな実行可能な解決策がありますが、クロージャ ファクトリはエレガントな可能性です。
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
ここでは、クロージャ ファクトリを使用して変数のバインド時間を微調整しています!-) 何らかの形で、これはクロージャ ファクトリのかなり一般的な使用例です。