假定以下代码结构:
#### 1/hhh/__init__.py: empty
#### 1/hhh/foo/__init__.py:
from hhh.foo.baz import *
#### 1/hhh/foo/bar.py:
xyzzy = 4
#### 1/hhh/foo/baz.py:
import hhh.foo.bar as bar
qux = bar.xyzzy + 10
我在
python
内部运行并执行1/
。它失败了:Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "hhh/foo/__init__.py", line 1, in <module>
from hhh.foo.baz import *
File "hhh/foo/baz.py", line 1, in <module>
import hhh.foo.bar as bar
AttributeError: 'module' object has no attribute 'foo'
现在我将
import hhh.foo.baz
替换为:# 1/hhh/foo/baz.py:
from hhh.foo.bar import xyzzy
qux = xyzzy + 10
再次执行
baz.py
。现在它可以工作了,尽管我正在加载同一个模块,但只绑定了不同的名称。这是否意味着
import hhh.foo.baz
和import module
之间的区别不仅仅局限于标识符?这里到底发生了什么?(我知道我可以使用相对进口来解决所有这些问题,但我还是想了解机制。另外,我不喜欢相对进口,PEP8也不喜欢。)
最佳答案
当您编写from hhh.foo.bar import xyzzy
python解释器时,将尝试从modulexyzzy
加载hhh.foo.bar
但是如果你写了import hhh.foo.bar as bar
它会首先尝试在bar
模块中找到hhh.foo
。因此,它评估hhh.foo
,执行from hhh.foo.baz import *
。hhh.foo.baz
尝试评估hhh.foo
,hhh.foo
尝试评估hhh.foo.baz
,循环导入,异常。
关于python - 为什么这两个Python导入的工作方式不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6730632/