Я экспериментировал с различными видами использования таких иерархий, как это, и различиями между абсолютным и относительным импортами, и не могу понять, как делать обычные вещи с пакетом, подпакетами и модулями без просто ставя все на sys.path. У меня есть иерархия пакетной два уровня:Тестирование модулей подпакетов в Python 3
MyApp __init__.py Application __init__.py Module1 Module2 ... Domain __init__.py Module1 Module2 ... UI __init__.py Module1 Module2 ...
Я хочу, чтобы иметь возможность сделать следующее:
- Run тестового кода в модуле в «если основных», когда импорт модуля из других модулей в том же каталоге.
- Имейте один или несколько модулей тестового кода в каждом подпапке, который проводит модульные тесты модулей в субпакете.
- Имейте набор модульных тестов, которые находятся где-то разумно, но вне подпакетов, либо в пакете для родственников, либо в пакете верхнего уровня, либо вне пакета верхнего уровня (хотя все это может закончиться тем, что выполняется тесты в каждом субпакете)
- «Введите» структуру из любого из трех уровней подпакета, например запускать код, который просто использует модули домена, запускать код, который просто использует прикладные модули, но приложение использует код как из модулей приложений, так и для домена, а запуск кода из GUI использует код из графического интерфейса и приложения; например, тестовый код приложения будет импортировать модули приложения, но не модули домена.
- После разработки основной части кода без подпакетов продолжайте разработку и тестирование после организации модулей в этой иерархии.
Я знаю, как использовать относительный импорт, так что внешний код, который помещает MyApp на его sys.path может импортировать MyApp, импортировать любые подпакеты он хочет, и импортные вещи из их модулей, в то время как модули в каждом подпакете могут импортировать другие модули из одного и того же подпакета или из пакетов sibling. Однако перечисленные выше требования к развитию кажутся несовместимыми с структурированием субпакетов - другими словами, я не могу иметь его в обоих направлениях: хорошо структурированную многоуровневую иерархию пакетов, используемую извне, а также используемую изнутри, в частности для тестирования но также потому, что модули с одного уровня разработки (в частности, пользовательский интерфейс) не должны импортировать модули с уровня разработки ниже следующего.
Извините за длинное эссе, но я думаю, что это справедливо представляет собой борьбу, с которой многие люди переходят к новым механизмам относительного импорта.
Должен быть абсолютный импорт, прежде чем модули могут относиться друг к другу относительно. Программа test.py в модуле приложения не может импортировать из .module1, а также не импортировать из .Domain.Module2: я бы получил ошибки «Попытка относительного импорта в непакете». Лучшее, что я мог бы сделать, было бы, чтобы тестовый код добавлял «..» в sys.path и делал его импорт, ссылаясь на приложение.Module1 и т. Д. При импортированном приложении Module1 может импортировать из .Module2. Однако ни один из них не может ссылаться на .domain.Module1. Для этого test.py пришлось бы поместить ../ .. в путь и импортировать из MyApp.Application. –
И почему вы не хотите использовать абсолютный импорт в первую очередь? Они прекрасны. –
Так, например, во время разработки я хочу быстро протестировать один подмодуль, поэтому я непосредственно тестирую субмодуль. И нет, относительный импорт не позволяет точно такие же вещи, как абсолютный импорт. Запустите скрипт внутри подпакета, и нет способа получить доступ к пакету верхнего уровня с относительным импортом. – Turion