假定以下代码结构:

#### 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.bazimport module之间的区别不仅仅局限于标识符?这里到底发生了什么?
(我知道我可以使用相对进口来解决所有这些问题,但我还是想了解机制。另外,我不喜欢相对进口,PEP8也不喜欢。)

最佳答案

当您编写from hhh.foo.bar import xyzzypython解释器时,将尝试从modulexyzzy加载hhh.foo.bar但是如果你写了import hhh.foo.bar as bar它会首先尝试在bar模块中找到hhh.foo。因此,它评估hhh.foo,执行from hhh.foo.baz import *hhh.foo.baz尝试评估hhh.foohhh.foo尝试评估hhh.foo.baz,循环导入,异常。

关于python - 为什么这两个Python导入的工作方式不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6730632/

10-12 23:56