为什么这两个Python导入的工作方式不同?
假设以下代码结构:为什么这两个Python导入的工作方式不同?,python,import,module,package,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 我在1/内部运行python并导入hhh.foo.baz。它失败了: Traceback (mos
#### 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
我在1/
内部运行python
并导入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'
然后再次执行导入hhh.foo.baz
。现在它可以工作了,虽然我正在加载相同的模块,但只绑定了不同的名称
这是否意味着import module
和from module import name
之间的区别不仅仅局限于标识符?这到底是怎么回事
(我知道我可以使用相对导入来解决所有这些问题,但我仍然想了解其中的机制。另外,我不喜欢相对导入,PEP 8也不喜欢。)当您从hhh.foo.bar编写
时,导入xyzy
Python解释器将尝试从模块hhh.foo.bar
加载xyzy
。但是如果您编写import hhh.foo.bar as bar
,它将首先尝试在hhh.foo
模块中查找bar
。因此,它计算hhh.foo
,从hhh.foo.baz导入*
hhh.foo.baz
尝试评估hhh.foo
,hhh.foo
尝试评估hhh.foo.baz
,循环导入,异常。在1/hhh/foo/\uuuuuuu init\uuuuuuuuuuuuuuuuuuupy
中,您需要设置\uuuuuuuuuuuuuuuuuuuuuuu all\uuuuuuuuuuu>列表,其中包含要导出的名称。i、 e.\uuuu all\uuuuxy=[“xyzy”]
为什么要从hhh.foo中的hhh.foo.bar导入<代码>导入栏
应该足够了
# 1/hhh/foo/baz.py:
from hhh.foo.bar import xyzzy
qux = xyzzy + 10