在 Python3 中,“导入”是否可以传递?

In Python3, does `import` work transitively?

在Python3中,import可以传递吗?

例如,如果一个模块包含 import A,而 A 的模块包含 import B,那么该模块是否间接导入 B

与其他语言相比:

Python 的 import、Java 的 import, and C'sinclude` 在 hook 下的工作如何有区别?

谢谢。

导入总是导入模块或包的命名空间。

: 一个包含__init__.py的目录 模块:扩展名为.py

的文件

模块

如果您有一个名为 a.py 的文件,其内容为:

x=2

名为 b.py 的文件,内容为:

import a
y=3

在解释器中它将是

>>> import b
>>> b.y
3

>>> b.a.x
2

套餐

包的行为有所不同(如果您来自 Java,可能不那么直观),其目录结构如下:

+ mypackage
+-__init__.py
+-test.py

导入包 mypackage 不会导入模块 test.py 但只会计算 __init__.py:

>>> import mypackage
>>> mypackage.test # will fail

当您将模块导入命名空间时,Python 会创建一个模块命名空间。这是递归的;当您导入 A 时,它将导入 B,如果失败,您将收到错误消息。否则可以通过 A.B

访问
# temp.py
def func_in_b():
    print 'this is B'

# temp2.py
import temp

def func_in_a():
    print 'this is A'

>>> import temp2
>>> temp2.func_in_a()
this is A
>>> temp2.temp.func_in_b()
this is B

C/C++ 的 #include 在预处理器级别工作。 Java 和 Python 没有预处理器。他们更聪明,他们的 VM 知道您可以在运行时导入的任何模块。导入有一种方法可以避免名称冲突。在 Java 中你可能根本不使用导入,但你应该每次都定义完整的 class 名称(例如 java.util.List 而不是 List)。 Python.

几乎相同