Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Reloading Modules ใน Python: importlib.reload()

เมื่อพัฒนาโค้ดแบบ 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()

  1. โค้ดโมดูลถูก recompile และ execute ใหม่
  2. Object ใหม่ถูกสร้างและ bind ใน module namespace
  3. Object เก่าถูก reclaim เมื่อ reference count = 0
  4. __init__ ของโมดูลไม่รันซ้ำ
  5. 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 แทน จะปลอดภัยกว่า