在Python3中,`import`是否可以传递?

时间:2017-10-11 12:26:23

标签: python import programming-languages

在Python3中,import是否可以传递?

例如,如果某个模块包含import A,并且A的模块包含import B,那么该模块会间接导入B吗?

与其他语言相比:

  • 在Java中,有些人说import不能传递,请参阅https://stackoverflow.com/a/46677664

  • 在C中,include确实可以传递。例如,如果文件包含#include "A.h",而A.h包含#include "B.h",则该文件还间接包含B.h

Python的import,Java import, and C's包含`如何在钩子下工作以产生差异?

感谢。

3 个答案:

答案 0 :(得分:5)

当您将模块导入命名空间时,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

答案 1 :(得分:0)

导入始终导入模块或包的名称空间。

:包含__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

答案 2 :(得分:0)

C / C ++的#include适用于预处理器级别。 Java和Python没有预处理器。它们更智能,它们的VM知道您可以在运行时导入的任何模块。进口有一种避免名称冲突的方法。在Java中你可能根本不使用导入,但是你应该每次都定义完整的类名(例如java.util.List只有List的instean。几乎与Python相同。