【问题标题】:Python's __loader__, what is it?Python __loader__,它是什么?
【发布时间】:2014-03-05 00:07:59
【问题描述】:

我在一些 Python 文件中看到了 __loader__ 这个术语,除了一些关于它的用途的简短描述之外,我找不到任何关于它的文档,但它们仍然没有提供足够的信息让我得到很好的理解它。我所知道的是它与导入模块有关,除了我完全不知所措。它有什么作用?什么时候使用?如果有的话,我该如何使用它?

【问题讨论】:

  • 我不知道......你在哪里看到的?这是我第一次看到这样的东西......
  • 我在内置模块linecache 中看到它,而我又从traceback 看到它。

标签: python loader python-import


【解决方案1】:

__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.MetaPathFinderimportlib.abc.PathEntryFinder


如果有的话,我该如何使用它?

__loader__ 的主要用途是自省。但是,还有另外两个常见用途:

  1. __loader__ 可用于在特定模块的加载器上收集数据。

  2. 在 Python 3.3 之前的版本中,__loader__ 可以与 hasattr 一起使用来检查模块是否通过内置的导入机制导入:

    >>> # Python 3.2 interpreter
    >>> import os
    >>> hasattr(os, '__loader__')
    False
    >>>
    

    如果hasattr(os, '__loader__') 已返回True,则意味着os 模块是使用自定义加载程序导入的。既然没有,那就意味着模块是使用内置的导入机制导入的。

    注意:由于 PEP 0302 所做的更改,上述测试将无法在 Python 3.3+ 中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2014-03-16
    • 2011-04-21
    • 2015-03-21
    相关资源
    最近更新 更多