我阅读了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上)。
有人知道这背后的原因吗?
发布于 2016-09-14 01:11:59
经过一番搜索,我自己找到了答案。
从本质上讲,循环导入对于from … import …来说是一个问题,因为它只在模块代码执行后才返回导入的模块。
为了说明,假设我们在b.py中导入了a,在a.py中导入了b。对于import a和import b,我只需查找sys.modules以找到a/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,将a放入sys.modules并执行a.py。接下来,它再次命中from b import d,并在sys.modules中找到b,但它是空的,抛出错误:没有属性d。
PS1:引用的帖子是错误的。import ... as ...适用于循环导入。
PS2:from a import c与在Python3中导入a.c相同
https://stackoverflow.com/questions/39357737
复制相似问题