Uji nama modul dalam sys.modules
kamus :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
Dari dokumentasi:
Ini adalah kamus yang memetakan nama modul ke modul yang telah dimuat.
Perhatikan import
pernyataan itu melakukan dua hal:
- jika modul belum pernah diimpor sebelumnya (== tidak ada di
sys.modules
), maka akan dimuat dan ditambahkan ke sys.modules
.
- Ikat 1 atau beberapa nama di namespace saat ini yang mereferensikan objek modul atau objek yang merupakan anggota namespace modul.
Ekspresi modulename not in sys.modules
menguji apakah langkah 1 telah dilakukan. Menguji hasil dari langkah 2 memerlukan mengetahui import
pernyataan persis apa yang digunakan saat mereka menetapkan nama yang berbeda untuk mereferensikan objek yang berbeda:
import modulename
set modulename = sys.modules['modulename']
import packagename.nestedmodule
set packagename = sys.modules['packagename']
(tidak peduli berapa banyak level tambahan yang Anda tambahkan)
import modulename as altname
set altname = sys.module['modulename']
import packagename.nestedmodule as altname
set altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
set objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
set nestedmodulename = sys.modules['packagename.nestedmodulename']
(hanya jika tidak ada objek yang bernama nestedmodulename
dalam packagename
namespace sebelum impor ini, nama tambahan untuk modul bersarang ditambahkan ke namespace paket induk pada saat ini)
from somemodule import objectname as altname
set altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
set altname = sys.modules['packagename.nestedmodulename']
(hanya jika tidak ada objek yang bernama nestedmodulename
dalam packagename
namespace sebelum impor ini, nama tambahan untuk modul bersarang ditambahkan ke namespace paket induk pada saat ini)
Anda dapat menguji apakah nama yang mengikat objek yang diimpor ada di namespace tertentu:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Ini hanya memberi tahu Anda nama yang ada (telah terikat), bukan jika itu merujuk ke modul atau objek tertentu dari modul itu. Anda dapat lebih jauh melakukan introspeksi objek itu atau menguji apakah itu objek yang sama dengan yang tersedia di sys.modules
, jika Anda perlu mengesampingkan bahwa nama telah disetel ke sesuatu yang lain sepenuhnya sejak saat itu.
raise SystemError()
(atau pengecualian lain pilihan Anda) di bagian atas modul yang tidak ingin Anda impor. Jika Anda benar - benar mengimpornya ke suatu tempat, program Anda akan melakukan pelacakan dan keluar.