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 module和from module import name超越标识符?到底发生了什么?
(我知道我可以使用相对导入来解决所有这些问题,但我仍然想了解其中的机制.另外,我不喜欢相对进口,也不喜欢PEP 8.)
当你编写from hhh.foo.bar import xyzzyPython解释器时会尝试xyzzy从模块加载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,循环导入,例外.
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |