Недавно я обнаружил, что хочу применить несколько фильтров к большому набору объектов Django. Эти фильтры были основаны на нескольких условиях, которые были далеко не тривиальными. Вначале это была небольшая, но важная функция, поэтому я начал писать единственную функцию «фильтр» с множеством циклов и условий. Как вы понимаете, эта функция оказалась слишком большой, и ее было слишком сложно поддерживать и обновлять. Это была ключевая часть продукта на ранней стадии, над которым я работал и который требовал регулярных обновлений. Помимо того, что он не был очень «питоновским», он был не очень идеальным.

После нескольких запросов на обновление и обратной связи с клиентом я решил провести рефакторинг этой ключевой части. Моя цель состояла в том, чтобы сделать его не только более удобным в сопровождении, но и более легким для обсуждения с клиентом. В то время для меня стало более очевидным, что код, который мы пишем, оказывает огромное влияние на то, насколько легко мы можем общаться с клиентом. На самом деле, вы даже можете оценить свой код по тому, насколько удобно вы предоставляете описание продукта среднего уровня менеджеру проекта или владельцу продукта. Структура кода, организация и удобочитаемость — очень хорошие составляющие отличной демонстрации спринта.

Вернемся к техническим вещам. Я начал с разделения функции на более мелкие функции, которые в итоге назвал воронками. Потому что они были такими на самом деле. Каждая воронка создавала подмножество данных из входных данных. Подмножество будет передано в следующую воронку в качестве входных данных и так далее, пока последняя не даст окончательный результат воронки. Это оказало огромную помощь в улучшении приложения, а также в описании концептуального решения для клиента. Нам нужно было только показать им изображение, подобное следующему:

Там изображение стоило тысячи строк кода.

Прежде чем приступить к рефакторингу, я, как обычно, начал с проверки в Интернете, чтобы узнать, нет ли уже инструмента для этого, чтобы не изобретать велосипед, но ни один из найденных мной инструментов не подходил для этого случая. Вот почему я решил сделать все возможное и сделать инструмент более универсальным и открытым.

pipe-exec доступен на Github и Pypi. Его можно определить как конвейер выполнения для применения к коллекции объектов. Это похоже на группу функций, которые последовательно выполняются со списком объектов. Как описано ранее, первоначальной целью этого проекта было реализовать структуру, помогающую создать конвейер воронки для экземпляров модели Django. Мы уверены, что может быть много других применений.

Инструмент все еще находится на ранней стадии, и все еще есть необходимые функции, но он очень хорошо выполняет свою задачу. Не стесняйтесь оставлять отзывы и вносить свой вклад.