我不断遇到以下包装器的用例:
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]])
答案 0 :(得分:6)
提供:
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]])
P.S。据我所知,Python中没有这种功能的内置函数。前段时间,我在Python邮件列表中谈到了缺乏“应用”功能,这是更“一般”的问题。我认为,operator.apply(f, args)
之类的东西对许多情况都有好处。除了关于传递模型的参数的参数之外,函数应用程序的这个函数表示也可以。
答案 1 :(得分:1)
虽然starmap
对于某些情况来说是一个很好的解决方案,但我认为在这种情况下更具可读性的另一个选择是改为使用list comprehension:
[x - y for x, y in [[-20, 20], [-20, 20], [32, 32]]
我建议您在发现自己使用operator
模块或lambda
时立即使用列表推导(或生成器表达式),因为它会导致更具可读性(并且经常使用更快的代码。
答案 2 :(得分:1)
这不是必需的,因为对于任何可调用的f
,你可以写:
lambda *args: f(*args)
您需要什么。语法比任何库调用都短。只有当你需要对你需要的转换本身进行修改时,它才能写出来,就像写作一样简单:
def starify(f):
return lambda *args: f(*args)