我在python2.7中观察到了一个未被发现的(imo)行为。程序结构如下所示:
run.py
package/
__init__.py
a.py
b.py
run.py:
from package import *
初始化的.py:
from package.a import *
现在将a.py
和b.py
视为空文件。
在我看来,这个程序应该通过循环导入失败。为什么?因为当我们导入package
init
文件时,绝对导入会导致在导入时访问相同的init
文件。
要查看我的情况除外,只需添加到a.py
这个:
from package.b import *
结果我们收到一个ImportError。
这是一个错误,还是例外行为?我在文档中找不到任何关于 init 文件中特殊处理的绝对导入的信息?
答案 0 :(得分:0)
我只是试图重现相同的情况,我意识到在我发帖的那天,我非常疲惫。问题无效:)。你们这是对的,这与绝对进口无关。
导入时, __init__.py
仅像任何其他模块一样加载,这是例外行为。因此,如果我在from package.a import *
__init__.py
中有__init__.py
这样的语句已经在sys.modules中(名称继承自文件夹,在本例中为package
),那么没有再加载。
仅当我们尝试使用未初始化的模块中的变量时,才会发生循环异常。因此,例如,如果我输入a.py
from package import *
解释器将终止,因为__init__
未完全初始化。