奇怪的“导入”与“导入为” python错误

时间:2019-04-09 15:46:09

标签: python python-3.6 python-import

我遇到了一个我不明白的错误,我设法将其归结为这个错误。这是目录结构:

temp
  temp2
    __init__.py
    mod.py
    mod2.py

以下是文件的内容:

#__init__.py
from temp.temp2.mod import *
from temp.temp2.mod2 import *

#mod.py
def f():
  pass

#mod2.py
import temp.temp2.mod as mod

然后我在ipython中打开一个新的python 3.6.8控制台,并尝试加载mod2,我得到了:

>>>import temp.temp2.mod2
Traceback (most recent call last):

  File "<ipython-input-1-...>", line 1, in <module>
    import temp.temp2.mod2

  File ".../temp/temp2/__init__.py", line 2, in <module>
    from temp.temp2.mod2 import *

  File ".../temp/temp2/mod2.py", line 1, in <module>
    import temp.temp2.mod as mod
AttributeError: module 'temp' has no attribute 'temp2'

其他一些事实。

首先,如果我将文件mod2.py更改为import temp.temp2.modfrom temp.temp2.mod import f,那么它将正常工作且没有错误。只有import as会导致错误。

第二,如果我没有嵌套的模块,只需将mod.pymod2.py__init__.py放在temp内(并相应地更改导入),那么我也没有任何错误。

知道发生了什么吗?

编辑时:

Attribute not added to module after importing对正在发生的事情作了部分解释。 temp没有属性temp2的原因是程序包temp.temp2目前仍在加载,而程序包temp2中的属性temp尚未设置直到此加载完成之后。但是它仍然无法回答有关importimport as为何导致不同行为的问题。

重申一下,这是唯一导致错误的mod2.py文件:

#mod2.py  -- results in error
import temp.temp2.mod as mod

这些都可以正常工作:

#mod2.py  -- works OK
import temp.temp2.mod

#mod2.py  -- works OK
from temp.temp2.mod import f

#mod2.py  -- works OK
from temp.temp2 import mod

#mod2.py  -- works OK
from temp.temp2 import mod as mod

因此,至少对我而言,包temp2中的属性temp在加载temp.temp2之后才被设置的事实并不能解释为什么这四个版本“ mod2.py”工作,而上面的一个给出了错误。

很显然,我有可以使用的解决方法,但是我想知道导致这种情况发生在幕后的原因,最好是记录在案。我试图找到一些解释模块加载详细信息的文档来解释这种现象,但是我没有找到答案。

0 个答案:

没有答案