为什么这些python导入语句的行为有所不同?

时间:2013-11-06 20:36:19

标签: python import circular-dependency

考虑以下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

0 个答案:

没有答案