เมื่อพัฒนาโค้ดแบบ Interactive (REPL, Jupyter) การแก้ไขโมดูลแล้ว import ใหม่ไม่ได้ เพราะ Python cache โมดูลไว้ ใช้ importlib.reload() เพื่อโหลดใหม่
Syntax
import importlib
importlib.reload(module_object)
ตัวอย่าง
>> import sys
>>> import importlib
>>> importlib.reload(sys)
Error ถ้ายังไม่ import
>> import importlib
>>> importlib.reload(sys)
NameError: name 'sys' is not defined
# ต้อง import sys ก่อน
สิ่งที่เกิดขึ้นเมื่อ reload()
- โค้ดโมดูลถูก recompile และ execute ใหม่
- Object ใหม่ถูกสร้างและ bind ใน module namespace
- Object เก่าถูก reclaim เมื่อ reference count = 0
- __init__ ของโมดูลไม่รันซ้ำ
- Reference ภายนอก (import แบบ
from mod import func) ไม่ได้อัปเดตอัตโนมัติ ต้อง import ใหม่
Best Practice
# ใน development loop
import mymodule
import importlib
# หลังแก้ไข mymodule.py
importlib.reload(mymodule)
# ถ้าใช้ from ... import ต้อง import ใหม่
from mymodule import myfunc # ได้ func ใหม่แล้ว
ข้อจำกัด
- ไม่ทำงานกับ built-in modules ที่ compile แล้ว (บางตัว)
- ไม่ update references ที่ import แบบ
from mod import nameแล้ว - Thread safety: ไม่ปลอดภัยถ้า reload ขณะ thread อื่นใช้โมดูลอยู่
สำหรับ Production ให้ restart process แทน จะปลอดภัยกว่า