标准Python包装器将f(x)转换为f(* x)?

时间:2012-12-16 18:43:19

标签: python functools

我不断遇到以下包装器的用例:

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]])

3 个答案:

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