Как спроектировать расширяемый сортировщик файлов
Иногда автоматизация начинается с простой задачи: «разложить файлы по папкам». Но если делать это «на коленке», через полгода получается монолит, в который страшно добавить новый фильтр.
В проекте ImageWalker я поставил цель: сделать инструмент, в который можно добавить новый критерий сортировки за 15 минут, не трогая ядро.
🔧 Архитектурные решения: • Плагинная система на основе интерфейсов: каждый фильтр реализует BaseFilterPlugin + Filter, регистрируется через декоратор @PluginRegistry.register. Ядро ничего не знает о конкретных фильтрах — только о контрактах. • Инверсия зависимостей (DIP): высокоуровневая логика сортировки зависит от абстракций, а не от реализаций. Это позволяет легко тестировать фильтры моками и заменять их без изменения ядра. • Типизация и валидация: конфигурация плагинов описывается через @dataclass + PluginConfig, что даёт статическую проверку и автодополнение в IDE. • Многоуровневая сортировка: фильтры можно комбинировать в произвольном порядке через order, что позволяет строить гибкие пайплайны обработки.
🤖 AI-плагин: Интегрировал кастомную свёрточную нейросеть (6 классов, Intel Image Classification) как один из фильтров. Модель загружается лениво, инференс работает в ~3 ГБ RAM. Важно: доменная логика классификации изолирована от файловой — это упрощает тестирование и замену модели.
📊 Результат: • Сотни файлов обработаны за один запуск, 100% применимости к плагинам • Добавление нового фильтра = реализация 2 интерфейсов + регистрация, без правки ядра • Документация через Sphinx
🔗 Репозиторий: https://github.com/Delshi/image_walker 🔗 Архитектура CNN: https://github.com/Delshi/Intel-Image-Classification
Готов обсудить подходы к плагинным архитектурам, инверсии зависимостей и интеграции ML-моделей в CLI-инструменты.
#Python #SoftwareArchitecture #PluginSystem #CleanCode #MachineLearning #OpenSource #Backend #OpenToWork
· 19.05
Плагинная система через интерфейсы это классика. В TypeScript делаю похожее через Strategy pattern плюс IoC контейнер. Единственная боль когда плагинов становится много: начинает болеть дискавери. Решил через манифест файл в каждом плагине с описанием что он умеет.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 20.05
Я хоть и не сталкивался с большим кол-вом плагинов (таки это пет-проект небольшой), однако могу представить вытекающие неудобства. Решением помимо манифеста мне видится добавление UI, похожего на ComfyUI, в котором блоки просто выстраивать цепочкой друг за другом. Но это уже совсем иной уровень сложности. С другой стороны, это уже не CLI получается. что не всегда уместно.
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён