我不断遇到以下包装器的用例:
def asterisk(fn):
def retfn(x):
return fn(*x)
return retfn
标准 Python 2 库中是否有已经做到这一点的东西?我看了看functools
,但找不到任何东西。
对于上下文,这是一个最近的用例:
print map(asterisk(operator.sub), [[-20, 20], [-20, 20], [32, 32]])
要提供这个:
print map(asterisk(operator.sub), [[-20, 20], [-20, 20], [32, 32]])
你应该使用
from itertools import starmap
print starmap(operator.sub, [[-20, 20], [-20, 20], [32, 32]])
PS 据我所知,Python 中没有此类功能的内置函数。前段时间,我在 Python 邮件列表中谈到缺少“应用”功能,这是更“一般”的问题。我认为,类似的东西operator.apply(f, args)
对很多情况都有好处。这种函数应用的函数表示也可以排除关于参数传递模型的参数。
虽然starmap
在某些情况下是一个很好的解决方案,但我觉得在这种情况下更具可读性的另一个选项是使用列表推导:
[x - y for x, y in [[-20, 20], [-20, 20], [32, 32]]
我建议您在发现自己使用operator
模块或lambda
s 后立即使用列表推导(或生成器表达式),因为它会导致代码更具可读性(并且通常更快)。
这不是真的必要,因为对于任何 callable f
,你可以写:
lambda *args: f(*args)
哪个可以满足您的需求。语法比任何库调用都短。只有当您需要具体化转换本身时,您才需要它,但是编写它就像编写一样简单:
def starify(f):
return lambda *args: f(*args)