Python - 如何检测自定义加载程序已加载模块?

时间:2012-10-30 08:36:03

标签: python python-3.3

在Python-3.3之前,我检测到模块是由hasattr(mod, '__loader__')的自定义加载程序加载的。 在Python-3.3之后,所有模块都具有__loader__属性,无论是否由自定义加载器加载。

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

如何检测自定义加载程序是否加载了模块?

1 个答案:

答案 0 :(得分:1)

在Python 3.3中,对__loader__属性的存在进行简单检查已经不够了。 PEP 302要求所有加载程序将其信息存储在模块的__loader__属性中。

我会为type(module.__loader__)添加一个额外的检查,看看模块是否加载了您要搜索的自定义加载器(或加载器列表):

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

从维护的角度来看,这可能是不好的,因为您必须保持自定义加载器列表是最新的。另一种类似的方法可能是创建标准内置加载器的列表,并将检查更改为not in STANDARD_LOADERS。但这仍然会有维护问题。