我读了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上)。
有谁知道这背后的原因?
答案 0 :(得分:0)
经过一番搜索,我自己找到了答案。
基本上,循环导入是from … import …
的一个问题,因为它只在执行模块代码后返回导入的模块。
为了说明,假设我们在a.py中导入a b.py并导入b。对于import a
和import 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相同