นากกายสีมิ้นต์ถือการ์ดชนิด list[int] และ Union ส่งเข้าช่อง TypeForm บนโต๊ะมิ้นต์

Python 3.15 PEP 747: TypeForm สำหรับฟังก์ชันที่รับ type expression

น้องกายEngineering

ไลบรารี 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