Почему эти два Python импорт работает по-другому?

Предположим следующую структуру кода:

#### 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 . Теперь он работает, хотя я загружаю один и тот же модуль, только привязывая другое имя.

Означает ли это, что различие между модулем импорта и из имени импорта модуля выходит за рамки просто идентификаторы? Что именно здесь происходит?

(Я знаю, что могу использовать относительный импорт, чтобы обойти все это, но все же я хотел бы понять механику. Кроме того, мне не нравится относительный импорт, как и PEP 8. )

7
задан Vasiliy Faronov 18 July 2011 в 09:02
поделиться