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

2024-10-03 09:19:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常遇到以下包装器的用例:

def asterisk(fn):
   def retfn(x):
      return fn(*x)
   return retfn

在标准的python2库中有什么东西已经做到了这一点吗?我查看了functools,但什么也没找到。你知道吗

对于上下文,下面是一个最近的用例:

print map(asterisk(operator.sub), [[-20, 20], [-20, 20], [32, 32]])

Tags: map标准returndefasterisk用例operatorfn
3条回答

虽然starmap在某些情况下是一个很好的解决方案,但这里的另一个选项(我觉得在本例中更具可读性)是使用list comprehension

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

我建议您在使用operator模块或lambda时立即使用列表理解(或生成器表达式),因为这样会产生可读性更高(通常更快)的代码。你知道吗

其实没有必要,因为对于任何可调用的f,您可以编写:

lambda *args: f(*args)

这正是你需要的。语法比任何库调用都短。只有当你需要将转换本身具体化时,你才需要它,但是写作和写作一样简单:

def starify(f):
    return lambda *args: f(*args)

为此:

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

另外,据我所知,Python中没有内置函数来实现这种功能。不久前,我在Python邮件列表中谈到了“apply”功能的缺乏,这是一个更“一般”的问题。我想,像operator.apply(f, args)这样的东西在很多情况下都是好的。函数应用程序的这种函数表示形式也可以包含关于传递模型的参数的参数。你知道吗

相关问题 更多 >