【问题标题】:Are both `import` statement and `builtin.__import__()` function implemented based on `importlib.__import()` function by default?`import` 语句和 `builtin.__import__()` 函数是否都默认基于 `importlib.__import()` 函数实现?
【发布时间】:2017-11-23 05:25:30
【问题描述】:

来自https://docs.python.org/3/library/importlib.html

importlib 包的用途有两个。

一个是提供 import 声明实现(因此,通过扩展, the __import__() function)在 Python 源代码中。这提供了一个 import 的实现,可移植到任何 Python 解释器。 这也提供了一个更容易理解的实现 而不是用 Python 以外的编程语言实现的。

二、实现import的组件暴露在这个包中, 使用户更容易创建自己的自定义对象(已知 一般作为进口商)参与进口过程。

是不是说import语句和builtin.__import__()函数默认都是基于importlib.__import()函数实现的?

但是https://stackoverflow.com/a/44655619/156458 暗示 builtins.__import__ 默认不基于importlib.__import__ 实现。

https://docs.python.org/3/library/functions.html#importbuitlins.__import__ 函数由import 语句调用。所以如果builtins.__import__默认不基于importlib.__import__实现,那么import语句默认也不基于importlib.__import__实现。

【问题讨论】:

    标签: python python-3.x python-import python-internals python-importlib


    【解决方案1】:

    不,实际的导入代码是 Python 代码的port。请参阅implementation of the PyImport_ImportModuleLevelObject() functionbuiltins.__import__ 基本上是一个轻量级 Python->C 包装器),其中包含注释:

    /* The below code is importlib.__import__() & _gcd_import(), ported to C
       for added performance. */
    

    因此出于性能原因import 使用 C 优化代码,而不是 importlib 的 Python 实现。这两个实现保持同步,但是,如果您要创建一个拉取请求,涉及其中一个,Python 核心开发人员会在接受您的更改之前要求您更新另一个。

    您对重点的使用使我相信您误读了文档; importlib 不是 import 语句的 实现。这是import 语句的实现 Python 源代码,与import 语句的实现 C 代码。

    【讨论】:

    • 谢谢。 “一个是在 Python 源代码中提供 import 语句的实现(进而扩展为 __import__() 函数)”,这三者之间的关系是什么意思?
    • @Tim:Python代码被更多人理解;通过提供 Python 实现,更多人可以尝试了解这一切是如何工作的,或许还可以提供改进建议。
    • 我明白了,谢谢。 buitlins.__import__ 属性默认绑定到buitlins.__import__ 函数是否正确,并且可以通过buitlins.__import__=<anyFunction> 重新绑定到importlib.__import 函数或任何自定义函数? So are buitlins.__import__` attribute and buitlins.__import__` function two distinct things defined in the module builtins?
    • @Tim:是的,你可以做builtins.__import__ = importlib.__import__,让你测试 Python 实现。
    • import语句是基于builtins.__import__函数还是builtins.__import__属性实现的?我问这个,因为如果它是基于属性实现的,并且当我将builtins.__import__属性重新绑定到与builtins.__import__函数不同的函数时,import语句将不会基于builtins.__import__函数实现而是基于我重新绑定到builtins.__import__ 属性的不同功能,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2022-06-13
    • 2021-04-24
    • 2015-12-05
    • 2012-06-05
    • 2018-11-26
    相关资源
    最近更新 更多