为什么这两个Python导入的工作方式不同?

Vas*_*nov 7 python import module package

假设以下代码结构:

#### 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
Run Code Online (Sandbox Code Playgroud)

我跑到python里面1/import hhh.foo.baz.它失败:

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'
Run Code Online (Sandbox Code Playgroud)

现在我替换baz.py为:

# 1/hhh/foo/baz.py:
from hhh.foo.bar import xyzzy
qux = xyzzy + 10
Run Code Online (Sandbox Code Playgroud)

再做一次import hhh.foo.baz.现在它工作,虽然我正在加载相同的模块,只绑定一个不同的名称.

这是否意味着区分import modulefrom module import name超越标识符?到底发生了什么?

(我知道我可以使用相对导入来解决所有这些问题,但我仍然想了解其中的机制.另外,我不喜欢相对进口,也不喜欢PEP 8.)

DrT*_*rsa 8

当你编写from hhh.foo.bar import xyzzyPython解释器时会尝试xyzzy从模块加载hhh.foo.bar.但如果你写import hhh.foo.bar as bar它会先尝试barhhh.foo模块中找到.所以它评估hhh.foo,做from hhh.foo.baz import * .hhh.foo.baz试图评估hhh.foo,hhh.foo试图评估hhh.foo.baz,循环导入,例外.