พิจารณารหัส 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 บังคับให้โค้ดทำในแบบที่น่าเกลียด (ด้วยดัชนีวิเศษ) หรือสร้างฟังก์ชันที่ไม่จำเป็น (ส่วนที่น่ารำคาญที่สุดคือการคิดชื่อที่ดีสำหรับฟังก์ชันที่ไม่จำเป็นเหล่านี้)
ฉันคิดว่าควรเพิ่มคุณลักษณะนี้กลับไปที่ lambdas เพียงอย่างเดียว มีทางเลือกอื่นที่ดีหรือไม่?
อัปเดต:ฉันกำลังใช้ตัวช่วยต่อไปนี้เพื่อขยายความคิดในคำตอบ
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 หากคุณต้องการแสดงความปรารถนาที่จะเห็นคุณลักษณะที่เพิ่มกลับมา