首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导入还是循环导入?

导入还是循环导入?
EN

Stack Overflow用户
提问于 2016-09-07 04:58:33
回答 1查看 162关注 0票数 1

我阅读了this post关于如何在python中防止循环导入的内容。我不明白帖子里的说法:

代码语言:javascript
复制
import package.a # Absolute import and 
import a # Implicit relative import (deprecated, py2 only)

可以避免循环导入,但是

代码语言:javascript
复制
from ... import ...
#or
import ... as .. 

不能(在python 2.x上)。

有人知道这背后的原因吗?

EN

回答 1

Stack Overflow用户

发布于 2016-09-14 01:11:59

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

从本质上讲,循环导入对于from … import …来说是一个问题,因为它只在模块代码执行后才返回导入的模块。

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

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

代码语言:javascript
复制
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相同

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39357737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档