【问题标题】:Python - How do you detect that a module has been loaded by custom loader?Python - 你如何检测到一个模块已被自定义加载器加载?
【发布时间】:2012-10-30 08:36:02
【问题描述】:

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

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

【问题讨论】:

    标签: python python-3.3


    【解决方案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。不过,这仍然存在维护问题。

    【讨论】:

    • 谢谢。就我而言,我无法事先获得 CUSTOM_LOADERS 列表。 STANDARD_LOADERS 更好,但在标准程序中准备有点困难。 &gt;&gt;&gt; import importlib._bootstrap &gt;&gt;&gt; loader_classes = tuple(x[0] for x in importlib._bootstrap._get_supported_file_loaders()) &gt;&gt;&gt; isinstance(os.__loader__, tuple(loader_classes)) True &gt;&gt;&gt; isinstance(sys.__loader__, tuple(loader_classes)) False &gt;&gt;&gt; sys.__loader__ <class></class>
    • 我认为STANDARD_LOADERS = file_loaders + (BuiltinImporter + FrozenImporter + zipimporter)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 2020-12-22
    • 2023-04-02
    • 2017-07-14
    • 2016-12-10
    • 2023-03-25
    • 2015-11-11
    相关资源
    最近更新 更多