次の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に投稿してみてください。