На Hacker News появилась интересная дискуссия о том, как управляться с большими Python‑проектами. Поскольку я причастен к достаточно большому проекту, то не могу удержаться и не поделиться своим видением на этот вопрос. Я составил список из трёх моментов, на которые стоит обратить внимание.

1. Обеспечьте себе безболезненную навигацию по коду

В большом проекте навигация по коду и автокомплит сильно упрощают разработку и поддержку. Всё, что ломает навигацию, должно подвергаться сомнению. А это значит, что хитрые конструкции и метапрограммирование должны быть очень хорошо обоснованы: без них либо не обойтись, либо очень сложно обойтись. В остальных случаях лучше выбирать более очевидные (в том числе для тулзов) пути.

2. Добейтесь хорошего покрытия тестами

Чем больше тестов, тем лучше. Если после изменений тесты не проходят — это повод радоваться. Если проходят, надо насторожиться и проверить, все ли тесты корректны. CI просто необходим.

Неплохо добавить проверку покрытия тестами. Причём из этой проверки не стоит исключать сами тесты: в них тоже может быть приличное количество неиспользуемого кода, с которым надо что‑то делать.

3. Пользуйтесь type hinting

Во‑первых, это отличное подспорье в самодокументировании кода (в Python 3). Во‑вторых, это очень хороший способ найти проблемы в интерфейсах функций. Если очень сложно описать, что функция принимает и что выдаёт, то, может, стоит эту функцию переписать.

Наш проект только готовится переехать на третью ветку Python, так что мы не можем в полной мере использовать type hinting в самих описаниях функций, но мы описываем типы в докстрингах. PyCharm очень сильно помогает в этом.

Этот список — краткий анализ собственного опыта работы над большим проектом на Python. Я не стал включать в него наставления по проектированию архитектуры проекта (компоненты нужно делать слабосвязными и т. п.). Подобные советы, как правило, не очень хорошо работают. Гораздо лучше и проще внедрить то, что легко проверить: не сломалась ли навигация по коду, есть ли тест, есть ли описание типов.