Python 的 __loader__ 是什么?
我在一些Python文件中看到过__loader__
这个词,但除了几条简短的描述外,我找不到相关的文档,这些描述也没能让我真正理解它。我只知道它和导入模块有关,除此之外我完全不明白。它到底是干什么的?什么时候会用到?如果可以的话,我该怎么使用它呢?
1 个回答
什么是
__loader__
?
__loader__
是一个属性,它在导入的模块上由加载器设置。访问这个属性时,会返回加载器对象本身。
在 Python 3.3 之前的版本中,内置的导入机制并不会设置 __loader__
。这个属性只在使用自定义加载器导入的模块上可用。
不过,在 Python 3.3 中,这个功能发生了变化,原因是 PEP 0302。现在,__loader__
在每个被导入的模块上都可以使用:
>>> # Python 3.3 interpreter
>>> import os
>>> os.__loader__
<_frozen_importlib.SourceFileLoader object at 0x01F86370>
>>>
什么是加载器?
加载器是一个由查找器返回的对象。它使用 load_module()
方法将模块加载到内存中。importlib.abc.Loader
是一个加载器的抽象基类的例子。
什么是查找器?
查找器是一个对象,它使用 find_module()
方法来尝试找到一个模块的加载器。importlib.abc.Finder
是一个查找器的抽象基类的例子。不过需要注意的是,它已经被弃用,取而代之的是 importlib.abc.MetaPathFinder
和 importlib.abc.PathEntryFinder
。
我该如何使用它,如果可以的话?
__loader__
的主要用途是用于自省(也就是查看对象的属性和方法)。不过,还有两个常见的用法:
__loader__
可以用来收集特定模块的加载器的数据。在 Python 3.3 之前的版本中,
__loader__
可以与hasattr
一起使用,检查一个模块是否是通过内置的导入机制导入的:>>> # Python 3.2 interpreter >>> import os >>> hasattr(os, '__loader__') False >>>
如果
hasattr(os, '__loader__')
返回True
,这意味着os
模块是通过自定义加载器导入的。因为它没有返回True
,所以说明这个模块是通过内置的导入机制导入的。注意: 上面的测试在 Python 3.3 及以上版本中将不再有效,因为 PEP 0302 的变化。