ทดสอบชื่อโมดูลในsys.modules
พจนานุกรม :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
จากเอกสาร:
นี่คือพจนานุกรมที่แมปชื่อโมดูลกับโมดูลที่โหลดไปแล้ว
สังเกตว่าimport
คำสั่งทำสองสิ่ง:
- ถ้าโมดูลไม่เคยได้รับก่อนที่จะนำเข้า (== ในไม่อยู่
sys.modules
) sys.modules
จากนั้นจะมีการโหลดและเพิ่มไปยัง
- ผูกชื่อ 1 ชื่อขึ้นไปในเนมสเปซปัจจุบันที่อ้างอิงอ็อบเจ็กต์โมดูลหรืออ็อบเจ็กต์ที่เป็นสมาชิกของเนมสเปซโมดูล
นิพจน์จะmodulename not in sys.modules
ทดสอบว่าขั้นตอนที่ 1 เกิดขึ้นหรือไม่ การทดสอบผลลัพธ์ของขั้นตอนที่ 2 ต้องการให้ทราบว่าimport
คำสั่งที่แน่นอนถูกใช้เนื่องจากตั้งชื่อที่แตกต่างกันเพื่ออ้างอิงวัตถุต่างกัน
import modulename
ชุด modulename = sys.modules['modulename']
import packagename.nestedmodule
ชุดpackagename = sys.modules['packagename']
(ไม่ว่าคุณจะเพิ่มระดับเพิ่มเติมกี่ระดับก็ตาม)
import modulename as altname
ชุด altname = sys.module['modulename']
import packagename.nestedmodule as altname
ชุด altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
ชุด objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
ชุดnestedmodulename = sys.modules['packagename.nestedmodulename']
(เฉพาะเมื่อไม่มีวัตถุที่ตั้งชื่อnestedmodulename
ในpackagename
เนมสเปซก่อนการนำเข้านี้ชื่อเพิ่มเติมสำหรับโมดูลที่ซ้อนกันจะถูกเพิ่มในเนมสเปซแพ็กเกจหลัก ณ จุดนี้)
from somemodule import objectname as altname
ชุด altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
ชุดaltname = sys.modules['packagename.nestedmodulename']
(เฉพาะเมื่อไม่มีวัตถุที่ตั้งชื่อnestedmodulename
ในpackagename
เนมสเปซก่อนการนำเข้านี้ชื่อเพิ่มเติมสำหรับโมดูลที่ซ้อนกันจะถูกเพิ่มในเนมสเปซแพ็กเกจหลัก ณ จุดนี้)
คุณสามารถทดสอบว่าชื่อที่ถูกผูกไว้กับวัตถุที่นำเข้ามีอยู่ในเนมสเปซที่กำหนดหรือไม่:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
สิ่งนี้จะบอกให้คุณทราบถึงชื่อที่มีอยู่เท่านั้น (ถูกผูกไว้) ไม่ใช่หากหมายถึงโมดูลหรือวัตถุเฉพาะจากโมดูลนั้น คุณสามารถวิเคราะห์วัตถุนั้นเพิ่มเติมหรือทดสอบว่าเป็นวัตถุเดียวกันกับสิ่งที่มีอยู่ในsys.modules
นั้นหรือไม่หากคุณจำเป็นต้องแยกแยะว่าชื่อนั้นถูกตั้งค่าเป็นอย่างอื่นทั้งหมดตั้งแต่นั้นมา
raise SystemError()
(หรือข้อยกเว้นอื่น ๆ ที่คุณเลือก) ที่ด้านบนของโมดูลที่คุณไม่ต้องการนำเข้า หากคุณไม่จริงนำเข้ามันบางโปรแกรมของคุณจะโยน traceback และออก