Рассмотрим следующий код 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)
Это очень некрасиво. Если бы лямбда была функцией, я мог бы сделать
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Удаление этой функции в python3 заставляет код либо действовать некрасиво (с магическими индексами), либо создавать ненужные функции (самая неприятная часть - придумать хорошие имена для этих ненужных функций)
Я думаю, что эту функцию следует добавить хотя бы только к лямбдам. Есть ли хорошая альтернатива?
Обновление: я использую следующий помощник, расширяющий идею в ответе
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
lambda
будет полностью удален из языка, чем отменить изменения, которые усложнили его использование, но вы можете попробовать опубликовать на python-ideas, если вы хотите выразить желание увидеть добавленную функцию.