Предположим следующую структуру кода:
#### 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/
и делаю 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'
Теперь я заменяю baz.py
на:
# 1/hhh/foo/baz.py:
from hhh.foo.bar import xyzzy
qux = xyzzy + 10
и снова сделайте import hhh.foo.baz
. Теперь он работает, хотя я загружаю тот же модуль, но привязываю только другое имя.
Значит ли это, что различие между import module
и from module import name
выходит за рамки просто идентификаторов? Что именно здесь происходит?
(Я знаю, что могу использовать относительный импорт, чтобы обойти все это, но все же я хотел бы понять механику. Плюс мне не нравится относительный импорт, как и PEP 8.)