Модуль 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