Considere o seguinte código python2
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Isso não é compatível com python3 e tenho que fazer o seguinte:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
Isso é muito feio. Se o lambda fosse uma função, eu poderia fazer
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Remover esse recurso em python3 força o código a fazer o caminho feio (com índices mágicos) ou a criar funções desnecessárias (a parte mais incômoda é pensar em bons nomes para essas funções desnecessárias)
Acho que o recurso deve ser adicionado de volta pelo menos para lambdas sozinho. Existe uma boa alternativa?
Atualização: estou usando o seguinte auxiliar, estendendo a ideia na resposta
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: uma versão mais limpa parastar
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambda
no mesmo espírito que ele se opõe map
, reduce
e filter
.
lambda
foi programado para remoção no py3k, pois é basicamente uma praga na linguagem. Mas ninguém conseguia chegar a um acordo sobre uma alternativa adequada para definir funções anônimas, então, eventualmente, Guido jogou as armas na derrota e foi isso.
map
e filter
sejam melhor substituídos por compreensões, eu gosto reduce
)
lambda
que seja removido da linguagem completamente do que reverter as alterações que a tornaram mais difícil de usar, mas você pode tentar postar em ideias-python se quiser expressar o desejo de ver o recurso adicionado de volta.