-1

Pythonでは、単純な関数の場合、引数を何らかの値foo(x, y)にバインドする方法が少なくとも3つありますy

# defining a nested function:
def foobar(x):
  return foo(x, y=yval)

# using lambda
foobar = lambda x: foo(x, y=yval)

# using functools
from functools import partial
foobar = partial(foo, y=yval)

上記のリストが網羅的であるとは思えませんが、どれを使用すればよいのでしょうか? それらはすべて、パフォーマンス、安全性、および名前空間の処理に関して同等ですか? または、各方法に余分なオーバーヘッドと注意事項がありますか? 他のメソッドが既に存在するのに、なぜfunctools定義する必要があるのでしょうか?partial

4

1 に答える 1

4

いいえ、それらはすべて同等ではありません。特に、alambdaは pickle 化できずfunctools.partial、IIRC は最近の Python バージョンでのみ pickle 化できます (ドキュメントで正確なバージョンを見つけることができません。2.6 では機能しません)。 、しかし 3.1 ではそうです)。関数を他の関数の内部で定義することもできません (2.6 でも 3.1 でも)。

ライブラリに が表示される理由partialは、インラインで関数を部分的に適用するための明示的なイディオムを提供するためです。定義 ( def) は、次のような式の途中には表示できません。

map(partial(foo, y=yval), xs)

また、 や の定義からは、 に任意の式を、定義に任意のステートメントをlambda入れることができるため、部分適用が行われていることがすぐにはわかりません。lambda

partial使用しない理由がない限り、使用することをお勧めします。

[実際、このリストは網羅的なものではありません。頭に浮かぶ最初の選択肢は、呼び出し可能なオブジェクトです。

class foobar:
    def __init__(self, yval):
        self.__yval = yval
    def __call__(self, x):
        return foo(x, self.__yval)

しかし、それらはそのような単純な問題には重いです。]

于 2012-10-18T16:34:35.763 に答える