Модуль Python и путаница при загрузке пакетов

Допустим, у меня есть что-то вроде этого:

,
Run── run.py
Test── тест
    ├── __init__.py
    Models── модели
    │ ├── foo
    │ │ ├── baby.py
    │ │ └── __init__.py
    │ ├── __init__.py
    │ └── user.py
    Start── start.py

run.py

from test import start

start.py

from .models import user

user.py

from . import foo

print(foo.baby.Baby)

baby.py

Baby = "I am a baby"

Теперь, когда вы запускаете run.py файл...

>>> python run.py
... traceback ...
AttributeError: 'module' object has no attribute 'baby'

Но если вы измените start.py как это:

from .models.foo import baby
from .models import user

все работает правильно.

Когда baby модуль в start.py не был загружен ранее, foo объект пакета не имеет ссылки на него (foo.baby.Baby бросил AttributeError). Но когда я загрузил baby модуль в start.py, foo объект пакета автоматически получил ссылку на babyмодуль.

Может кто-нибудь объяснить мне, как это работает?

1 ответ

Решение

Подмодули не являются автоматически атрибутами пакета, пока не импортированы.

Вам нужно импортировать test.models.foo.baby сначала до foo.baby.Baby работает. Вы можете сделать это в foo/__init__.py файл:

from . import baby
Другие вопросы по тегам