Kiểm tra tên mô-đun trong sys.modules
từ điển :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
Từ tài liệu:
Đây là một từ điển ánh xạ tên mô-đun đến các mô-đun đã được tải.
Lưu ý rằng một import
câu lệnh thực hiện hai điều:
- nếu mô-đun chưa bao giờ được nhập trước đây (== không có trong
sys.modules
), thì nó sẽ được tải và thêm vào sys.modules
.
- Liên kết 1 hoặc nhiều tên trong không gian tên hiện tại tham chiếu đến đối tượng mô-đun hoặc đến các đối tượng là thành viên của không gian tên mô-đun.
Kiểm modulename not in sys.modules
tra biểu thức nếu bước 1 đã diễn ra. Kiểm tra kết quả của bước 2 yêu cầu biết import
câu lệnh chính xác nào đã được sử dụng khi chúng đặt các tên khác nhau để tham chiếu các đối tượng khác nhau:
import modulename
bộ modulename = sys.modules['modulename']
import packagename.nestedmodule
bộ packagename = sys.modules['packagename']
(bất kể bạn thêm bao nhiêu cấp độ bổ sung)
import modulename as altname
bộ altname = sys.module['modulename']
import packagename.nestedmodule as altname
bộ altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
bộ objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
bộ nestedmodulename = sys.modules['packagename.nestedmodulename']
(chỉ khi không có đối tượng nào được đặt tên nestedmodulename
trong packagename
không gian tên trước lần nhập này, tên bổ sung cho mô-đun lồng nhau được thêm vào không gian tên gói mẹ tại thời điểm này)
from somemodule import objectname as altname
bộ altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
bộ altname = sys.modules['packagename.nestedmodulename']
(chỉ khi không có đối tượng nào được đặt tên nestedmodulename
trong packagename
không gian tên trước lần nhập này, tên bổ sung cho mô-đun lồng nhau được thêm vào không gian tên gói mẹ tại thời điểm này)
Bạn có thể kiểm tra xem tên mà đối tượng được nhập bị ràng buộc có tồn tại trong một không gian tên nhất định hay không:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Điều này chỉ cho bạn biết tên tồn tại (đã bị ràng buộc), không phải nếu nó đề cập đến một mô-đun hoặc đối tượng cụ thể từ mô-đun đó. Bạn có thể tìm hiểu sâu hơn về đối tượng đó hoặc kiểm tra xem nó có giống đối tượng với những thứ có sẵn trong đó không sys.modules
, nếu bạn cần loại trừ rằng tên đã được đặt hoàn toàn khác kể từ đó.
raise SystemError()
(hoặc ngoại lệ khác mà bạn chọn) ở đầu mô-đun mà bạn không muốn nhập. Nếu bạn làm thực sự nhập nó ở đâu đó, chương trình của bạn sẽ ném một traceback và thoát.