繁体   English   中英

循环导入导入vs导入?

[英]Import vs import on circular import?

我读了这篇关于如何在python中阻止循环导入的帖子 我不明白帖子中的主张:

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

可以避免循环导入但是

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

不能(在python 2.x上)。

有谁知道这背后的原因?

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

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

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

另一方面, from a import c 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中导入ac相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM