循环导入导入vs导入?

时间:2016-09-06 20:58:33

标签: python python-2.7 import

我读了this post关于如何防止python中的循环导入。我不明白帖子中的主张:

import package.a # Absolute import and 
import a # Implicit relative import (deprecated, py2 only)

可以避免循环导入,但

from ... import ...
#or
import ... as .. 

不能(在python 2.x上)。

有谁知道这背后的原因?

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我自己找到了答案。

基本上,循环导入是from … import …的一个问题,因为它只在执行模块代码后返回导入的模块。

为了说明,假设我们在a.py中导入a b.py并导入b。对于import aimport b,我只需查找sys.modules来查找/ b,只需放入一个新模块并返回。

另一方面,b.py中的from a import c有这样的代码(伪python,类似于a.py中的from b import d

if 'a' not in sys.modules:
    sys.modules[a] = (A new empty module object)
    run every line of code in a.py
    add the module a to its parent's namespace
return module 'a'

我们从a.py开始,将b的空模块放到sys.modules并开始执行b.py并在sys.modules中放入并执行a.py.接下来它再次点击from b import d并在sys.modules中找到b,但它是空的,抛出错误:没有属性d。

PS1:推荐的帖子是错误的。 import ... as ...适用于循环导入。

PS2:from a import c与在python 3中导入a.c相同