2012-10-30 5 views
5

Trước Python-3.3, tôi phát hiện thấy một mô-đun đã được tải bởi trình tải tùy chỉnh với hasattr(mod, '__loader__'). Sau Python-3.3, tất cả các mô-đun có thuộc tính __loader__ bất kể được tải bởi trình tải tùy chỉnh.Python - Làm cách nào để bạn phát hiện thấy một mô-đun đã được tải bởi trình tải tùy chỉnh?

Python-2.7, 3.2:

>>> import xml 
>>> hasattr(xml, '__loader__') 
False 

Python-3.3:

>>> import xml 
>>> hasattr(xml, '__loader__') 
True 
>>> xml.__loader__ 
<_frozen_importlib.SourceFileLoader object at ...> 

Làm thế nào để phát hiện rằng một mô-đun được nạp bởi một bộ nạp tùy chỉnh?

Trả lời

1

Kiểm tra đơn giản cho sự tồn tại của thuộc tính __loader__ không còn đủ trong Python 3.3. PEP 302 yêu cầu tất cả các trình tải lưu trữ thông tin của chúng trong thuộc tính __loader__ của một mô-đun.

tôi sẽ thêm một kiểm tra bổ sung cho type(module.__loader__) để xem các mô-đun đã được nạp với các bộ nạp tùy chỉnh (hoặc trong danh sách các bộ tải) bạn đang tìm kiếm:

>>> CUSTOM_LOADERS = [MyCustomLoader1, MyCustomLoader2] 
>>> type(xml.__loader__) in CUSTOM_LOADERS 
True 

Đây có thể là xấu từ một duy trì quan điểm, trong đó bạn sẽ phải giữ danh sách các trình tải tùy chỉnh được cập nhật. Một cách tiếp cận tương tự khác có thể là tạo ra một danh sách các trình nạp sẵn dựng sẵn tiêu chuẩn và thay đổi kiểm tra là not in STANDARD_LOADERS. Điều này vẫn sẽ có vấn đề bảo trì mặc dù.

+0

Cảm ơn. Trong trường hợp của tôi, tôi không thể có được danh sách CUSTOM_LOADERS trước. STANDARD_LOADERS là tốt hơn, nhưng nó là hơi khó khăn để chuẩn bị trong thủ tục tiêu chuẩn. >>> import importlib._bootstrap >>> loader_classes = tuple(x[0] for x in importlib._bootstrap._get_supported_file_loaders()) >>> isinstance(os.__loader__, tuple(loader_classes)) True >>> isinstance(sys.__loader__, tuple(loader_classes)) False >>> sys.__loader__

+0

Tôi nghĩ 'STANDARD_LOADERS = file_loaders + (BuiltinImporter + FrozenImporter + zipimporter)'. –