Considere el siguiente código de python2
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Esto no es compatible con python3 y tengo que hacer lo siguiente:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
Esto es muy feo. Si la lambda fuera una función, podría hacer
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
La eliminación de esta función en python3 obliga al código a hacer lo feo (con índices mágicos) o crear funciones innecesarias (la parte más molesta es pensar en buenos nombres para estas funciones innecesarias)
Creo que la función debería volver a agregarse al menos solo a las lambdas. ¿Existe una buena alternativa?
Actualización: estoy usando el siguiente ayudante extendiendo la idea en la respuesta
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: una versión más limpia parastar
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambda
que se elimine del lenguaje por completo que revertir los cambios que lo hicieron más difícil de usar, pero podría intentar publicar en Python-ideas si desea expresar su deseo de que se vuelva a agregar la función.