3

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

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

3 回答 3

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

PS 据我所知,Python 中没有此类功能的内置函数。前段时间,我在 Python 邮件列表中谈到缺少“应用”功能,这是更“一般”的问题。我认为,类似的东西operator.apply(f, args)对很多情况都有好处。这种函数应用的函数表示也可以排除关于参数传递模型的参数。

于 2012-12-16T18:45:05.267 回答
1

虽然starmap在某些情况下是一个很好的解决方案,但我觉得在这种情况下更具可读性的另一个选项是使用列表推导:

[x - y for x, y in [[-20, 20], [-20, 20], [32, 32]]

我建议您在发现自己使用operator模块或lambdas 后立即使用列表推导(或生成器表达式),因为它会导致代码更具可读性(并且通常更快)。

于 2012-12-16T19:27:33.047 回答
1

这不是真的必要,因为对于任何 callable f,你可以写:

lambda *args: f(*args)

哪个可以满足您的需求。语法比任何库调用都短。只有当您需要具体化转换本身时,您才需要它,但是编写它就像编写一样简单:

def starify(f):
    return lambda *args: f(*args)
于 2012-12-16T20:11:36.733 回答