1

考虑以下 python 包:

/pkg
/pkg/__init__.py
/pkg/a.py
/pkg/b.py

a 和 b 模块都相互依赖,因此每个模块都必须导入另一个——循环依赖。似乎有 4 种方法可以执行此导入语句。

a.py里面:

import b

b.py内部(我一次只使用其中一个导入语句):

import a
import pkg.a
from pkg import a
from . import a

这些 import 语句在语法上都是相同 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
4

0 回答 0