python 3.x:将参数绑定到给定值

时间:2012-10-18 16:28:43

标签: python python-3.x

在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

1 个答案:

答案 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)

但对于这样一个简单的问题,这些都是重量级的。]