在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
包含`如何在钩子下工作以产生差异?
感谢。
答案 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相同。