5

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

如何检测到模块是由自定义加载器加载的?

4

1 回答 1

1

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

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

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

从维护的角度来看,这可能很糟糕,因为您必须使自定义加载程序列表保持最新。另一种类似的方法可能是创建标准内置加载器列表并将检查更改为not inSTANDARD_LOADERS。不过,这仍然存在维护问题。

于 2012-10-31T20:51:40.353 回答