Я экспериментировал с различными видами использования иерархий, таких как эта, и с различиями между абсолютным и относительным импортом, и не могу понять, как делать рутинные вещи с пакетом, подпакетами и модулями, не помещая все в sys.path , У меня есть двухуровневая иерархия пакетов:
MyApp
__init__.py
Application
__init__.py
Module1
Module2
...
Domain
__init__.py
Module1
Module2
...
UI
__init__.py
Module1
Module2
...
Я хочу иметь возможность сделать следующее:
- Запустите тестовый код в модуле "if main ", когда модуль импортирует из других модулей в том же каталоге.
- В каждом подпакете есть один или несколько модулей тестового кода, которые запускают модульные тесты для модулей в подпакете.
- Иметь набор модульных тестов, которые находятся в каком-то разумном месте, но за пределами подпакетов, либо в одноуровневом пакете, либо в пакете верхнего уровня, либо вне пакета верхнего уровня (хотя все это может закончиться тем, что выполняется тесты в каждом подпакете)
- «Введите» структуру с любого из трех уровней подпакета, например, запускать код, который использует только модули Domain, запускать код, который использует только модули Application, но Application использует код из модулей Application и Domain, а выполнять код из GUI использует код из GUI и Application; например, тестовый код приложения будет импортировать модули приложения, но не модули домена.
- После разработки основной части кода без подпакетов продолжите разработку и тестирование после организации модулей в этой иерархии.
Я знаю, как использовать относительный импорт, чтобы внешний код, который помещает MyApp в свой sys.path, мог импортировать MyApp, импортировать любые необходимые ему подпакеты и импортировать вещи из своих модулей, в то время как модули в каждом подпакете могут импортировать другие модули из тот же подпакет или из родственных пакетов. Однако перечисленные выше потребности в разработке кажутся несовместимыми со структурированием подпакетов - иными словами, у меня не может быть двух вариантов: хорошо структурированная многоуровневая иерархия пакетов, используемая извне, а также используемая изнутри, в частности для тестирования но также потому, что модули с одного уровня разработки (в частности, пользовательского интерфейса) не должны импортировать модули с уровня разработки ниже следующего уровня.
Извините за длинное эссе, но я думаю, что оно справедливо представляет борьбу, которую многие люди переносят на новые механизмы относительного импорта.