2012-10-30 19 views
5

Python-3.3'ten önce, bir modülün hasattr(mod, '__loader__') ile özel bir yükleyici tarafından yüklendiğini tespit ettim. Python-3.3'ten sonra, tüm modüller, özel bir yükleyici tarafından yüklenmeksizin __loader__ özniteliğine sahiptir.Python - Bir modülün özel yükleyici tarafından yüklendiğini nasıl anlarsınız?

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

nasıl bir modül özel bir yükleyici tarafından yüklenen olduğunu tespit ederiz?

cevap

1

__loader__ özniteliğinin varlığı için basit bir denetim Python 3.3'te artık yeterli değildir. PEP 302, tüm yükleyicilerin bilgilerini bir modülün __loader__ özniteliğinde saklamasını gerektirir. Bu kötü olabilir

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

:

modül özel yükleyici ile yüklenmesi halinde type(module.__loader__) görmesini çok ek bir kontrol eklersiniz

(veya yükleyici bir listede) aradığınız bakım noktası görünümü, özel yükleyicilerin listesini güncel tutmak zorunda kalacaksınız. Bir başka benzer yaklaşım, standart dahili yükleyicilerin bir listesini oluşturmak ve kontrolü not in STANDARD_LOADERS olarak değiştirmek olabilir. Bu yine de bakım sorununa sahip olacak.

+0

Teşekkürler. Benim durumumda, CUSTOM_LOADERS listesini önceden alamıyorum. STANDARD_LOADERS daha iyidir, ancak standart prosedürde hazırlamak biraz zor. >>> 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

Sanırım 'STANDARD_LOADERS = file_loaders + (BuiltinImporter + FrozenImporter + zipimporter)'. –

İlgili konular