我已经看到__loader__
这个词漂浮在一些Python文件中,除了一些关于它的目的的简短描述之外,我找不到任何文档,但它们仍然存在没有为我提供足够的信息以便更好地了解它。我所知道的是它与导入模块有关,除了我完全不知所措。它有什么作用?什么时候使用?如果可以的话我该怎么用?
答案 0 :(得分:12)
什么是
__loader__
?
__loader__
是由其加载器在导入的模块上设置的属性。访问它应该返回加载器对象本身。
在3.3之前的Python版本中,__loader__
未由内置导入机制设置。相反,此属性仅适用于使用自定义加载程序导入的模块。
但是,由于PEP 0302,此功能在Python 3.3中已更改。现在,__loader__
可用于导入的每个模块:
>>> # Python 3.3 interpreter
>>> import os
>>> os.__loader__
<_frozen_importlib.SourceFileLoader object at 0x01F86370>
>>>
什么是装载机?
loader是查找程序返回的对象。它使用其load_module()
方法将模块加载到内存中。 importlib.abc.Loader
是加载器的抽象基类的一个示例。
什么是发现者?
finder是一个使用其find_module()
方法尝试查找模块加载器的对象。 importlib.abc.Finder
是查找程序的抽象基类的示例。但请注意,它已被弃用,而不是importlib.abc.MetaPathFinder
和importlib.abc.PathEntryFinder
。
如果有的话,我该如何使用?
__loader__
的主要用途是内省。但是,还有另外两种常见用途:
__loader__
可用于收集特定模块的加载程序上的数据。
在3.3之前的Python版本中,__loader__
可与hasattr
一起使用,以检查是否使用内置导入机制导入模块:
>>> # Python 3.2 interpreter
>>> import os
>>> hasattr(os, '__loader__')
False
>>>
如果hasattr(os, '__loader__')
返回True
,则表示使用自定义加载程序导入os
模块。由于它没有,这意味着该模块是使用内置的导入机器导入的。
注意:由于PEP 0302所做的更改,上述测试在Python 3.3+中无效。