2012-10-30 13 views
5

Przed Python-3.3 wykryłem, że moduł został załadowany przez niestandardowy program ładujący z hasattr(mod, '__loader__'). Po wersji Python-3.3 wszystkie moduły mają atrybut __loader__, niezależnie od tego, czy zostały załadowane przez niestandardowy program ładujący.Python - Jak można wykryć, że moduł został załadowany przez niestandardowy program ładujący?

Pythona 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 ...> 

Jak wykryć, że moduł został załadowany przez ładowaczem niestandardowej?

Odpowiedz

1

Prosta kontrola istnienia atrybutu __loader__ nie jest już wystarczająca w Pythonie 3.3. PEP 302 wymaga, aby wszystkie programy ładujące zapisywały swoje informacje w atrybucie modułu __loader__.

Dodam dodatkowy sprawdzian dla type(module.__loader__) aby sprawdzić, czy moduł został załadowany z ładowaczem niestandardowej (lub na liście ładowarki) szukasz:

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

To może być zły z punktu A punktu widzenia konserwacji, ponieważ będziesz musiał aktualizować listę niestandardowych ładowarek. Innym podobnym podejściem może być utworzenie listy standardowych wbudowanych ładowarek i zmiana czeku na not in STANDARD_LOADERS. Będzie to nadal jednak problem z konserwacją.

+0

Dzięki. W moim przypadku nie mogę wcześniej uzyskać listy CUSTOM_LOADERS. STANDARD_LOADERS jest lepszy, ale przygotowanie standardowej procedury jest nieco trudniejsze. >>> 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

Myślę, że 'STANDARD_LOADERS = file_loaders + (BuiltinImporter + FrozenImporter + zipimporter)'. –

Powiązane problemy