![นากกายสีมิ้นต์ถือการ์ดชนิด list[int] และ Union ส่งเข้าช่อง TypeForm บนโต๊ะมิ้นต์](/images/python/python-315-pep-747-typeform.webp?v=161e610acc473a26)
Python 3.15 PEP 747: TypeForm สำหรับฟังก์ชันที่รับ type expression
ไลบรารี runtime type check หลายตัวรับ “ชนิด” เป็นอาร์กิวเมนต์ เช่น list[int] หรือ str | None แต่ annotate พารามิเตอร์นั้นด้วย type[T] ไม่พอ เพราะหลาย type form ไม่ใช่คลาส
PEP 747 สถานะ Final เพิ่ม typing.TypeForm สำหรับเคสนี้ใน Python 3.15
ปัญหาของ type[T]
type[T] รับได้เฉพาะ class object การส่ง Literal['hi'] หรือ str | None จะโดน type checker ตี
TypeForm[T] หมายถึง type form object ที่แทนชนิด T หรือชนิดที่ assignable ไปยัง T
เคสที่ใช้จริง
- ตัวเช็ก assignability /
TypeIs - คอนเวอร์เตอร์ที่รับชนิดแล้วคืนค่าแคบลง
- คำอธิบายฟิลด์ที่มี
value_type: TypeForm[T]
ตัวอย่างแนวคิดจาก PEP (ส่วนย่อลายเซ็น ไม่ได้รัน)
def trycast[T](typx: TypeForm[T], value: object) -> T | None: ...
type[T] เป็น subtype ของ TypeForm[T] ดังนั้นฟังก์ชันที่รับ TypeForm ยังรับคลาสธรรมดาได้
มีรูปแบบเรียก TypeForm(str | None) เพื่อบอกเจตนาและให้เช็กเกอร์ตรวจว่าเป็น type expression ที่ถูกต้อง
สิ่งที่ยังยาก
ฟังก์ชันที่รับ TypeForm ทุกแบบต้องรองรับ special form ใหม่ทุกเวอร์ชัน สตริง annotation และ recursive type ซึ่ง PEP เองก็เตือนว่าไม่ง่าย
Recap
- ใช้
TypeForm[T]เมื่อพารามิเตอร์รับ type expression ไม่ใช่แค่คลาส type[T]ยังใช้เมื่อต้องการคลาสที่สร้างอินสแตนซ์ได้- อย่าสับสนกับ annotation qualifier อย่าง
Finalที่ไม่ใช่ type expression - อ่าน PEP 747 ก่อนอัปลายเซ็นไลบรารี introspection