我的目录结构如下:
test/
__init__.py
m1/
__init__.py
f1.py
f2.py
test/__init__.py
是空的。
test/m1/__init__.py
包含一行import test.m1.f1
.
test/m1/f1.py
包含一行import test.m1.f2 as f2
.
在 python 3.7.6 中,我可以做import test.m1
一切都按预期进行。但是,在 python 3.6.9 中,当我尝试这样做时,出现以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/scratch/test/m1/__init__.py", line 2, in <module>
import test.m1.f1
File "/home/scratch/test/m1/f1.py", line 1, in <module>
import test.m1.f2 as f2
AttributeError: module 'test' has no attribute 'm1'
这看起来很奇怪,因为它不会出错import test.m1.f1
,这是它遇到的第一件事。它在随后的错误import test.m1.f2 as f2
声明,声称test
has no m1
子模块。
import test.m1.f2 as f2
尝试访问m1
的属性test
模块对象,作为查找要绑定的对象过程的一部分f2
. The m1
属性不会被设置,直到test.m1
子包完成初始化,直到__init__.py
for test.m1
执行完毕。
在 Python 3.7 及更高版本上 https://bugs.python.org/issue30024,如果属性查找失败,则导入回退到sys.modules['test.m1.f2']
查找找到test.m1.f2
。 3.6 中不存在这种回退,导致观察到的差异。
类似的后备 https://bugs.python.org/issue17636也存在于圆形from
不过,在 Python 3.5 及更高版本上导入from . import f2
or from test.m1 import f2
不需要后备。这from
导入检索test.m1
直接来自sys.modules
,所以它只寻找f2
属性,并且该属性存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)