แฟ้มปิดสองใบและแฟ้มที่ถูกดึงเปิดด้วยแถบสีอำพันบนโต๊ะมิ้นต์

lazy import ใน Python 3.15: เลื่อนโหลดโมดูลจนกว่าจะถูกใช้จริง

น้องกายEngineering

เปิด CLI แล้วรอสองวิแค่พิมพ์ --help เพราะ import ทั้งโปรเจกต์ตั้งแต่บรรทัดแรก เป็นอาการที่หลายคนเจอ PEP 810 เลยเพิ่มคำว่า lazy ให้ import แบบชัดเจนใน Python 3.15

Lazy import คือการสร้างชื่อในโมดูลทันที แต่ยังไม่โหลดและรันไฟล์เป้าหมาย จนกว่าจะมีการใช้ชื่อนั้นครั้งแรก

เขียนยังไง

ตามสเปกของ PEP นี่เป็นตัวอย่างโค้ดแบบ fragment / pseudocode จากเอกสาร ไม่ได้รันในบทความนี้:

lazy import json
lazy from json import dumps

หลังบรรทัดนี้ json ยังไม่อยู่ใน sys.modules จนกว่าจะเรียก เช่น json.dumps(...) ตอนนั้นค่อยโหลดจริง ข้อผิดพลาดอย่าง ImportError ก็เลื่อนมาเกิดตอนใช้ ไม่ใช่ตอนบรรทัด import

มีข้อจำกัดสำคัญ: ใช้ได้ที่ระดับโมดูล ไม่ใส่ในฟังก์ชัน คลาส หรือ try และห้ามใช้กับ from ... import *

ทำไมถึงช่วยชีวิตจริง

CLI ที่มีหลายคำสั่งมักโหลดไลบรารีที่คำสั่งนั้นไม่ได้ใช้ PEP บอกว่าการย้าย import เข้าไปในฟังก์ชันเป็นวิธีแก้ที่คนใช้กันอยู่แล้ว แต่กระจายยากและอ่านกราฟ dependency ยาก lazy import ทำให้เก็บ import ไว้บนสุดของไฟล์ได้ แต่เลื่อนต้นทุนไปตอนจำเป็น

สิ่งที่ต้องระวังคือ side effect ตอน import เช่น การลงทะเบียนปลั๊กอิน ถ้าโมดูลพึ่งการรันตอนถูก import การทำให้ lazy อาจทำให้ registry ว่างจนกว่าจะแตะชื่อนั้น

ทางย้ายสำหรับโค้ดที่ต้องรองรับรุ่นเก่า

PEP มี __lazy_modules__ เป็นรายชื่อสตริง บน 3.15 จะทำให้ import เหล่านั้นเป็น lazy ส่วนบนรุ่นเก่าจะถูกละเว้นแล้วโหลดแบบปกติ จึงใช้เป็นสะพานย้ายได้

Recap

  • เริ่มจาก import ที่แพงและไม่ได้ใช้ทุกคำสั่งใน CLI
  • อย่า lazy โมดูลที่ต้องมี side effect ทันทีเมื่อถูก import
  • ทดสอบเส้นทาง error ที่เคยเกิดตอน import ให้ย้ายไปเกิดตอนใช้
  • ลองบน 3.15.0rc2 ก่อน final 1 ต.ค. 2026 ตามประกาศ Insider ครับ