考虑下面的 python2代码
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Python3不支持这一点,我必须执行以下操作:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
这太丑了,如果 Lambda 是一个函数,我也可以
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
在 python3中删除这个特性,会迫使代码要么采用丑陋的方式(使用神奇的索引) ,要么创建不必要的函数(最麻烦的部分是为这些不必要的函数想一个好名字)
我认为这个功能至少应该单独添加到 lambdas 中。有没有一个好的替代方案?
更新: 我正在使用下面的助手扩展答案中的想法
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: star的更清晰版本
import functools
def star(f):
@functools.wraps(f)
def f_inner(args):
return f(*args)
return f_inner