在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
?
答案 0 :(得分:4)
不,它们并非都是等价的 - 特别是lambda
无法被腌制而functools.partial
可以,IIRC,只能在最近的Python版本中被腌制(我找不到哪个)文档中的确切版本;它在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)
但对于这样一个简单的问题,这些都是重量级的。]