
PEP 798: ใช้ * และ ** ใน comprehension ของ Python 3.15
น้องกายEngineering
เคยรวมลิสต์ย่อยหลายอันแล้วเขียน for สองชั้นใน comprehension จนสลับลำดับไหม ผมเคยครับ
PEP 798 สถานะ Final สำหรับ Python 3.15 อนุญาตให้ใส่ * / ** ที่หัวนิพจน์ของ list/set/dict comprehension และ generator expression เพื่อรวม iterable หรือ dict ตามจำนวนที่ไม่รู้ล่วงหน้า
รูปที่ PEP ยกตัวอย่าง
ตัวอย่างด้านล่างเป็นส่วนย่อจาก PEP ไม่ได้รันบนอินเทอร์พรีเตอร์ในบทความนี้
[*it for it in its] # รวม iterable เป็น list
{*it for it in its} # รวมเป็น set
{**d for d in dicts} # รวม dict
(*it for it in its) # generator ของการต่อกัน
ความหมายเทียบเท่าการ extend / update ในลูป หรือ double-for แบบเดิม แต่สั้นกว่าและสมมาตรกับ unpacking ของ PEP 448
ข้อจำกัดที่ควรจำ
*/**ใช้ได้ที่ระดับบนสุดของนิพจน์ใน comprehension เท่านั้น- พฤติกรรมของ generator ที่ unpack ไม่ได้ delegate แบบ
yield fromเต็มรูปแบบตามที่ PEP อธิบายในส่วน semantics
Recap
- อ่าน PEP 798 ก่อนรีแฟกเตอร์ double-loop comprehension
- ลองบน 3.15 candidate ก่อนพึ่งในโปรดักชัน
- เก็บรูปแบบเดิมไว้ถ้าทีมยังอ่านไม่อินกับ syntax ใหม่