在Python-3.3之前,我检测到一个模块是由自定义加载器加载的hasattr(mod, '__loader__').在Python-3.3之后,所有模块都具有该__loader__属性,无论是否由自定义加载器加载.
Python-2.7,3.2:
>>> import xml
>>> hasattr(xml, '__loader__')
False
Run Code Online (Sandbox Code Playgroud)
Python的3.3:
>>> import xml
>>> hasattr(xml, '__loader__')
True
>>> xml.__loader__
<_frozen_importlib.SourceFileLoader object at ...>
Run Code Online (Sandbox Code Playgroud)
如何检测自定义加载程序加载模块?
小智 1
在 Python 3.3 中,简单检查属性是否存在__loader__已不再足够。PEP 302要求所有加载器将其信息存储在__loader__模块的属性中。
我会添加一个额外的检查,以type(module.__loader__)查看模块是否已使用您正在搜索的自定义加载程序(或加载程序列表)加载:
>>> CUSTOM_LOADERS = [MyCustomLoader1, MyCustomLoader2]
>>> type(xml.__loader__) in CUSTOM_LOADERS
True
Run Code Online (Sandbox Code Playgroud)
从维护的角度来看,这可能很糟糕,因为您必须保持自定义加载程序列表是最新的。另一种类似的方法可能是创建标准内置加载器的列表并将检查更改为not inSTANDARD_LOADERS。但这仍然存在维护问题。