考虑以下python包:
/pkg
/pkg/__init__.py
/pkg/a.py
/pkg/b.py
a和b模块彼此依赖,因此每个模块必须导入另一个 - 循环依赖。似乎有4种方法可以执行此import语句。
在 a.py :
内import b
在 b.py 内(我一次只使用其中一个导入语句):
import a
import pkg.a
from pkg import a
from . import a
这些import语句都是同一导入的语法上不同的版本,但它们的工作方式并不相同。尝试导入 pkg.a 会产生不同的结果。
import a
第一种导入样式无误地运行;虽然它会在python3中失败或者如果指定了绝对导入,所以我宁愿不使用弃用的样式。
import pkg.a
这也有效,但它使代码更加冗长,特别是当有其他子包时。
from pkg import a
这失败了。 ImportError: cannot import name a
from . import a
这也会因同样的错误而失败。
为什么这些导入语句会导致不同的行为?最后两种风格应该失败似乎很奇怪,特别是因为它们似乎是未来的首选风格。我正在使用python 2.7。
修改
要测试此操作,请使用以下代码创建test.py:
import pkg.a
修改
此外,如果您使用as
语法尝试缩短导入语句上的导入符号,否则它也会失败,尽管它将是AttributeError
:
import pkg.a as a