Почему это происходит?
Когда вы импортируете модуль Python (ваш import factory
), вы можете получить прямой доступ к тому, что объявлено в этом модуле (например, factory.Factory
): все символы, объявленные в модуль автоматически экспортируется.
Однако, если вложенный модуль не импортирован в его родительский модуль, его необходимо импортировать напрямую.
Здесь доступно factory.Factory
, поскольку factory/__init__.py
содержит:
from .base import Factory
=> Когда вы набираете factory.Factory
, Python ищет символ с именем Factory
в factory/__init__.py
, который (по приведенной выше строке) является ссылкой на Factory
класс, определенный в factory/base.py
.
Поскольку в factory/__init__.py
нет строки с from . import fuzzy
, Python не может загрузить его таким образом.
Но почему бы вам не добавить эта строка?
Другие модули в пакете factory_boy зависят от сторонних пакетов; например, factory.django
импортирует Django. Если factory/__init__.py
содержит строку from . import django
(требуется, чтобы factory.django
было доступно из import factory
), то для каждой программы, которая запускает import factory
, потребуется установить Django.
, чтобы разрешить пользователи пакета сами решали, от чего они зависят; был сделан выбор не добавлять эти прямые импорты на верхний уровень пакета, когда это возможно, - это позволяет будущим версиям добавлять внешние зависимости, не нарушая существующий код.