Bagaimana cara memeriksa apakah saya mengimpor modul di suatu tempat dalam kode?
if not has_imported("somemodule"):
print('you have not imported somemodule')
Alasan saya ingin memeriksa apakah saya sudah mengimpor modul adalah karena saya memiliki modul yang tidak ingin saya impor karena terkadang program saya kacau.
python
python-import
yuval
sumber
sumber
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.Jawaban:
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:
Perhatikan
import
pernyataan itu melakukan dua hal:sys.modules
), maka akan dimuat dan ditambahkan kesys.modules
.Ekspresi
modulename not in sys.modules
menguji apakah langkah 1 telah dilakukan. Menguji hasil dari langkah 2 memerlukan mengetahuiimport
pernyataan persis apa yang digunakan saat mereka menetapkan nama yang berbeda untuk mereferensikan objek yang berbeda:import modulename
setmodulename = sys.modules['modulename']
import packagename.nestedmodule
setpackagename = sys.modules['packagename']
(tidak peduli berapa banyak level tambahan yang Anda tambahkan)import modulename as altname
setaltname = sys.module['modulename']
import packagename.nestedmodule as altname
setaltname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
setobjectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
setnestedmodulename = sys.modules['packagename.nestedmodulename']
(hanya jika tidak ada objek yang bernamanestedmodulename
dalampackagename
namespace sebelum impor ini, nama tambahan untuk modul bersarang ditambahkan ke namespace paket induk pada saat ini)from somemodule import objectname as altname
setaltname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
setaltname = sys.modules['packagename.nestedmodulename']
(hanya jika tidak ada objek yang bernamanestedmodulename
dalampackagename
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:
# is this name visible in the current scope: 'importedname' in dir() # or, is this a name in the globals of the current module: 'importedname' in globals() # or, does the name exist in the namespace of another module: '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.sumber
numpy
paket - apakah menggunakanimport sys
di dalam fungsi adalah yang terbaik untuk memeriksa bahwa ia telah diimpor? Yang saya maksud dengan "terbaik" adalah dalam kaitannya dengan dampak kinerja yangimport sys
akan dipanggil setiap kali fungsi tersebut dipanggil. Terima kasihimport sys
itu mahal;sys
selalu ada, secara default sudah dimuat. Tetapi untuk paket opsional: cukup impor paketnya . TangkapImportError
pengecualian jika paket tidak diinstal, dan setel tanda yang menunjukkan bahwa paket tersebut diinstal saat impor berhasil. Setelah itu Anda bisa menggunakan flag untuk menginformasikan penggunaan dependensi opsional Anda.name in sys.modules
Pengujian ini hanya berguna jika Anda tidak ingin mengimpor .Untuk jawaban sys.modules yang diterima, saya akan menambahkan satu peringatan untuk berhati-hati dalam mengganti nama modul saat impor:
>>> import sys >>> import datetime as dt >>> 'dt' in sys.modules False >>> 'datetime' in sys.modules True
sumber
gunakan sys.modules untuk menguji apakah modul telah diimpor (saya menggunakan unicodedata sebagai contoh):
>>> import sys >>> 'unicodedata' in sys.modules False >>> import unicodedata >>> 'unicodedata' in sys.modules True
sumber
sys.modules
berisi semua modul yang digunakan di mana saja dalam instance interpreter saat ini dan muncul jika diimpor dalam modul Python lainnya.dir()
memeriksa apakah nama itu didefinisikan di namespace saat ini.Kombinasi dari 2 lebih aman daripada masing-masing terpisah dan berfungsi selama Anda tidak mendefinisikan
copy
diri sendiri.if ('copy' in sys.modules) and ('copy' in dir()):
sumber
if "sys" not in dir(): print("sys not imported!")
sumber
sys
bisa apa saja, bukan hanya modul.