นากกายสีมิ้นต์รวมถาดเล็กหลายใบเข้าถาดใหญ่ใบเดียวบนโต๊ะมิ้นต์

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 ใหม่