在 Python3 中,“导入”是否可以传递?
In Python3, does `import` work transitively?
在Python3中,import
可以传递吗?
例如,如果一个模块包含 import A
,而 A
的模块包含 import B
,那么该模块是否间接导入 B
?
与其他语言相比:
在Java中,有人说import
不能传递,见。
在 C 中,include
确实可以传递。例如,如果一个文件包含 #include "A.h"
,而 A.h
包含 #include "B.h"
,则该文件还间接包含 B.h
。
Python 的 import
、Java 的 import, and C's
include` 在 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.
几乎相同
在Python3中,import
可以传递吗?
例如,如果一个模块包含 import A
,而 A
的模块包含 import B
,那么该模块是否间接导入 B
?
与其他语言相比:
在Java中,有人说
import
不能传递,见。在 C 中,
include
确实可以传递。例如,如果一个文件包含#include "A.h"
,而A.h
包含#include "B.h"
,则该文件还间接包含B.h
。
Python 的 import
、Java 的 import, and C's
include` 在 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.