Мне нужно поддерживать некоторый инструмент ETL, сконструированный таким образом, чтобы задачи и конвейеры определялись как набор пакетов Python.Подумайте об архитектуре плагинов с небольшим ядром и почти тысячами плагинов во вложенных пространствах имен / пакетов / подпакетов.Это не горячий беспорядок пока , общее качество довольно хорошее, но setup.py
и __init__.py
-ы выглядят очень неприлично и иногда вызывают неожиданные проблемы при импорте.
Я бы хотелчтобы упростить это немного.Начиная с Python 3.3 мы можем помещать пакеты в пространства имен, просто создавая подкаталоги без __init__.py
.Это именно то, что мне нужно, но я бы хотел избежать глубоко вложенных подкаталогов в исходном коде, потому что большое количество пакетов очень мало.В крайнем случае они выглядели бы так:
$ tree
.
├── setup.cfg
├── setup.py
└── src
└── foo
└── bar
└── baz
└── xyz
└── uvw
└── package
├── actual_code.py
└── __init__.py
Есть ли способ использовать неявные пространства имен без такой глубокой структуры и просто указать пространство имен где-нибудь в setup.py
(или даже лучше setup.cfg
)?Другими словами, существует ли простой способ сказать: установить package
в foo.bar.baz.xyz.uvw
пространстве имен?
Я хотел бы иметь такую структуру:
$ tree
.
├── setup.cfg
├── setup.py
└── src
└── package
├── actual_code.py
└── __init__.py
но процесс установки должен поместить package
в папку foo/bar/baz/xyz/uvw/package
, чтобы ее можно было импортировать с полным путем.
Редактировать: Это даже хорошая идея?