
PEP 814: frozendict ใน builtins ของ Python 3.15
เคยส่ง dict เข้า @functools.lru_cache แล้วโดนฟ้องว่า unhashable ไหม นั่นคือช่องที่ frozendict มาเติม
PEP 814 สถานะ Final เพิ่มชนิด frozendict ใน builtins ของ Python 3.15 มันเป็น immutable mapping ไม่ได้สืบทอดจาก dict แต่ทำ Mapping protocol และเก็บลำดับการแทรก
ถ้าคีย์และค่า hash ได้ ตัว frozendict ก็ hash ได้ จึงใช้เป็นคีย์ของ dict หรือสมาชิกของ set ได้ และใช้เป็นค่าเริ่มต้นของพารามิเตอร์โดยไม่เจอปัญหา mutable default แบบเดิม
สิ่งที่ PEP ย้ำเรื่องความปลอดภัยของเธรด
เมื่อสร้างแล้ว ความไม่เปลี่ยนระดับตื้น (shallow immutability) ถูกการันตี แชร์ข้ามเธรดได้โดยไม่ต้องล็อก ตราบใดที่ค่าข้างในไม่ถูกใครแก้ต่อ
ระวังว่าถ้าค่าเป็น list แล้วใครไปแก้ list นั้น ภาพรวมยังเปลี่ยนได้ ต้องแยกเรื่อง shallow กับ deep
Recap
- อ่าน PEP 814 ก่อนออกแบบ API ที่ต้องการ mapping คงที่
- ใช้ frozendict แทน dict ที่ไม่ควรมีใครแก้
- อย่าคาดหวังว่าเป็น subclass ของ dict
- ทดสอบบน 3.15 candidate ก่อนพึ่งในโปรดักชัน