Hãy xem xét mã python2 sau
In [5]: points = [ (1,2), (2,3)]
In [6]: min(points, key=lambda (x, y): (x*x + y*y))
Out[6]: (1, 2)
Điều này không được hỗ trợ trong python3 và tôi phải làm như sau:
>>> min(points, key=lambda p: p[0]*p[0] + p[1]*p[1])
(1, 2)
Điều này rất xấu xí. Nếu lambda là một hàm, tôi có thể làm
def some_name_to_think_of(p):
x, y = p
return x*x + y*y
Loại bỏ tính năng này trong python3 buộc mã phải làm theo cách xấu xí (với các chỉ mục ma thuật) hoặc tạo các chức năng không cần thiết (Phần làm phiền nhất là nghĩ ra tên hay cho các chức năng không cần thiết này)
Tôi nghĩ rằng tính năng này nên được thêm lại ít nhất cho riêng lambdas. Có một giải pháp thay thế tốt không?
Cập nhật: Tôi đang sử dụng trình trợ giúp sau để mở rộng ý tưởng trong câu trả lời
def star(f):
return lambda args: f(*args)
min(points, key=star(lambda x,y: (x*x + y*y))
Update2: Phiên bản sạch hơn chostar
import functools
def star(f):
@functools.wraps(f):
def f_inner(args):
return f(*args)
return f_inner
lambda
bị xóa hoàn toàn khỏi ngôn ngữ để đảo ngược các thay đổi khiến nó khó sử dụng hơn, nhưng bạn có thể thử đăng lên ý tưởng python nếu bạn muốn bày tỏ mong muốn thấy tính năng được thêm lại.