どのようにこのPythonの関数のコード作業はできますか?
-
13-09-2019 - |
質問
これはmatplotlibのにcsv2recのソースコードからのものである
どのようにすることができます。この機能の作品、その唯一のパラメータがある場合は、「funcを、デフォルトの」?
def with_default_value(func, default):
def newfunc(name, val):
if ismissing(name, val):
return default
else:
return func(val)
return newfunc
ISMISSINGは、名前と値をとり、行がnumpyの配列でマスクされるべきかどうかを決定する。
funcがどちらかそれはデータを変換... int型、float型、またはdateparser、をstrされます。たぶん重要ではありません。私はちょうどそれが「名前」と「値」を取得することができますどのように思ったんだけど。
私は初心者です。任意の2centsをありがとう!私は他の人を助けるために十分ではあり得ることを期待!
解決
このwith_default_value
機能は、多くの場合、「閉鎖」(技術的には、閉鎖が返されるの内側のの機能はむしろあり、ここnewfunc
として(不正確)と呼ばれるものですここを "http://en.wikipedia.org/wiki/Closure_(computer_science)" のrel = "nofollowをnoreferrer">)。より一般的に、with_default_value
は( "HOF")の高次関数である:それは、引数として関数(func
)をとり、それはまた、結果としての機能(newfunc
)を返す
私はのデコレータの概念でこれを混乱答えを見ての のない場合は間違いなくあるのPythonで構築しました - あなたはfunc
に言及し、特に以来、頻繁にあることビルトインなどint
として。デコレータはまた、高階関数ではなく、具体的なものです:飾らを返すもの、すなわち「濃縮」、ののみの引数にする必要があり、その関数の引数(のバージョン - 「の引数を持つデコレーター」その関数の引数とまったく同じ名前に再割り当て(したがって、典型的には同じものを持っていますデコレータHOF複数の引数)を与えることによって機能/クロージャネスティング、しないのいずれかより多くのレベルを介して取得されます署名 - 。そうでない場合はデコレータを使用してはなりの非常にの独特な、非慣用的な、読めない、など)。
だから、ケースとは全く関係がありませんデコレータを、忘れて、とnewfunc
閉鎖に焦点を当てます。囲む機能(複数可)の(引数はローカル変数であるため、引数名を含む)字句ネストされた関数は、すべてのローカル変数名(再バインドされていないが)を参照することができます - それはそれはクロージャとして知られている理由です:それはこれらの「上閉鎖さ」です「自由変数」。ここで、newfunc
はfunc
とdefault
を参照することができます - 。とし、
高階関数は、関数がファーストクラスのオブジェクトである(ので、あなたは、引数として渡すために行う関数の値としてそれらを返す、あるいはリストにそれらを格納する必要がある特別な何もない、特に以来、Pythonで非常に自然なことですはるかに困難少し難しく、あるいは - または他の容器には、など)、およびオブジェクトの機能と他の種類の間には、名前空間の区別はありません、などなど彼らは言及しているという理由だけで機能、の自動的な呼び出しが(それは難しいません - この種の区別)の抽選を行う他の言語インチPythonでは、機能に言及することはそういうことだ - 言及。場合(名前、または他の方法によっても呼ばれる)機能オブジェクトは括弧が続く場合CALLにのみ発生します。
それはについてのすべてだこの例にあります - あなたが疑問に残るいくつかの他の特定の局面があります場合など、ここでコメントし、あなたの質問を編集すること自由に感じていますしてください。
!編集:そうOPは丁重に "閉鎖工場" のより多くの例を求めてコメントしています。ここでは一つだ - GUIツールキットのいくつかの抽象の種類を想像し、あなたがしようとしている。
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
これは正しく動作しません - 1つのボタンがクリックされた時点でようi
内lambda
は、遅延バインディングでi
の値は常に、の最後ののボタンの指標になるだろうクリックされた1どんなに。そこ様々な実行可能解があるが、閉鎖工場は、エレガントな可能性があります:
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
ここで、我々は変数の結合時間を微調整するために閉鎖工場を使用している - !。)1つの特定のフォームまたは別では、これは閉鎖工場のためにかなり一般的な使用例です。
他のヒント
これは、Pythonのデコレータです。 (PEP 318でデコレータについてのすべてを読む - http://www.python.orgの/ dev /のPEP / PEP-0318 / の)
あなたはコードを見れば、あなたはおそらくこのような何かを見つけるでしょう。
def some_func(name, val):
# ...
some_func = with_default_value(some_func, 'the_default_value')
このデコレータの意図は、(それらがNoneに設定されている場合、おそらく)の名前またはVal引数のいずれかが不足している場合は、デフォルト値を供給するようです。
それが動作する理由についてます:
with_default_valueは、基本的に「FUNC」のコールとwith_default_valueに渡されたものは何でもしてsubstitedデフォルト値で、そのネストされたnewfuncのののコピーであることを行っている関数オブジェクトを返します。
誰かがない場合、は「FOO = with_default_valueを(バーは、3」)、戻り値は、基本的に新しい機能になるだろう。
def foo(name, val):
ifismissing(name, val):
return 3
else:
return bar(val)
あなたは、その戻り値を取り、それを呼び出すことができます。
これは、別の関数を返す関数です。 name
とvalue
が返され、関数のパラメータであります。