Розглянемо наступний код 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-idea, якщо хочете висловити бажання повернути цю функцію.