Автор статьи столкнулся с этим в проекте, который писал ИИ-агент. Вместо поиска готовых функций агент добавлял новые копии. Когда понадобилось изменить нормализацию данных, он уже не мог разобраться, какую из четырёх править.
Обычные проверки не покрывают всю структуру проекта:
* Ruff находит нарушения правил и умеет проверять сложность при соответствующей настройке.
* mypy проверяет типы.
* pytest проверяет сценарии, для которых написаны тесты.
При этом дублирование между файлами, неиспользуемые функции и нарушения архитектурных границ могут остаться незамеченными.
Автор предлагает добавить структурный анализ. Его инструмент pyscn ищет дубли, сложные функции, мёртвый код и нарушения правил зависимостей:
uvx pyscn analyze .
Что полезно забрать в свой проект:
* Блокировать в CI новые проблемы, а не сразу весь накопленный техдолг.
* Следить за изменением сложности, а не только за общей оценкой.
* Закрепить допустимые зависимости между модулями проверяемыми правилами.
* Дать агенту запускать анализатор до отправки кода на ревью.
Высокая сложность сама по себе ещё не повод переписывать функцию. Иногда длинная последовательность понятных проверок лучше искусственного дробления.
Статья — https://codescan.dev/blog/ruff-mypy-pytest-and-then-what
