Ruff линтер и форматтер для Python — инструмент, который в последние годы привлекает внимание разработчиков своей скоростью и набором возможностей. Он сочетает в себе функции статического анализа, исправления стиля и форматирования кода, при этом работает заметно быстрее многих аналогов. В этой статье я расскажу, как Ruff устроен, где его использовать и какие настройки дают реальную пользу в повседневной работе.

Коротко о природе Ruff

Ruff — это написанный на Rust инструмент, ориентированный на разработку Python-кода. Благодаря реализации на Rust он выполняет проверку кода и правки с высокой производительностью, что особенно заметно в больших репозиториях.

В основе Ruff лежит поддержка большого набора правил, знакомых пользователям flake8, isort и других утилит. Это означает, что многие привычные предупреждения можно получать и исправлять одним инструментом.

Почему выбирают Ruff

Первый аргумент в пользу Ruff — скорость. Проверка и автоматические исправления выполняются быстрее, чем у большинства аналогов, что сокращает время локального тестирования и CI. Это особенно важно при частых коммитах и при работе над крупными проектами.

Второй аргумент — объединение ролей. Ruff может заменять комбинацию flake8, isort и некоторых плагинов, что упрощает конфигурацию и уменьшает количество зависимостей в окружении. Для многих команд это снижает траты на поддержку инструментов.

Третий плюс — гибкость правил. Ruff предоставляет детализированную настройку включения и исключения конкретных ошибок, а также автоматическое исправление множества нарушений. Это даёт тонкий контроль над стилем без лишних усилий.

Ключевые возможности

Ruff сочетает статический анализ и автоисправления. Он обнаруживает синтаксические и стилевые проблемы, предлагает правки и может автоматически исправлять ряд ошибок прямо в коде.

Поддержка большого набора правил и совместимость с экосистемой позволяют постепенно мигрировать к Ruff без резких изменений в существующих процессах. Это удобно для поэтапного внедрения в проект.

  • Быстрая проверка больших кодовых баз.
  • Автоисправления для многих типов ошибок.
  • Конфигурируемые правила и исключения.
  • Интеграция с редакторами и CI/CD.

Установка и базовая настройка

Установить Ruff можно несколькими способами: через pip, через пакетный менеджер системы или использовать предсобранные бинарники. Для большинства проектов достаточно pip-установки в виртуальном окружении.

Простейшая команда для установки через pip:

pip install ruff

После установки полезно добавить базовый конфиг в корень проекта. Ruff читает настройки из pyproject.toml или отдельного ruff.toml, что удобно для совместимости с остальными инструментами.

Пример конфигурации

Ниже пример минимальной конфигурации в pyproject.toml, которая включает автоисправления и отключает ряд правил, мешающих в конкретном проекте.

[tool.ruff]
line-length = 88
select = ["E", "F", "W", "C90"]
ignore = ["E203", "W503"]
extend-ignore = []
exclude = ["migrations", "venv"]
fix = true

Такой файл задаёт длину строки, набор выбранных категорий и исключения. Параметр fix = true позволяет использовать автоматическое исправление при запуске ruff —fix.

Интеграция с редакторами и CI

Ruff хорошо интегрируется с популярными редакторами: в VS Code есть расширение, которое использует Ruff как линтер и форматтер. Настройка занимает пару кликов или запись в settings.json. Для vim/Neovim и других редакторов есть плагины, поддерживающие работу через LSP или внешние команды.

В CI Ruff тоже работает быстро, поэтому его легко включить в пайплайн без значительного увеличения времени выполнения. Пример шага в GitHub Actions:

- name: Run Ruff
  run: |
    pip install ruff
    ruff check .

Если нужно автоматическое исправление в CI, можно запускать ruff format или ruff —fix, но чаще исправления делают локально, а CI остаётся контрольной точкой для запрета незамеченных предупреждений.

Сравнение с другими инструментами

Ruff часто сравнивают с flake8, Black и isort. Каждый инструмент решает свою задачу, но Ruff пытается покрыть сразу несколько областей. Ниже — краткая таблица для ориентира.

Инструмент Основная задача Замена Ruff
flake8 Статический анализ Да, часть правил
Black Форматирование Не полностью, но Ruff форматирует некоторые вещи
isort Сортировка импортов Да

Стоит учитывать, что Black остаётся эталоном форматирования и гарантирует неизменность стиля при повторном запуске. Ruff форматирует быстрее, но иногда имеет отличные от Black решения; в таких случаях их можно использовать вместе.

Настройка правил и исключений

Гибкая настройка — одно из сильных мест Ruff. Можно отключать конкретные ошибки по коду, настройкам пути или даже для отдельных файлов через inline-комментарии. Это удобно, когда часть кода наследуется от старой базы и требует особого подхода.

Примеры исключений и inline-правил:

# Отключить правило для строки
some_var = 1  # noqa: F841

# Отключить правило для файла
# ruff: noqa: D

В конфигурации есть extend-ignore и select, что позволяет гибко управлять набором активных проверок. Обычно я начинаю с преднастроек и только потом тонко настраиваю исключения под реальный код.

Когда Ruff не подходит

Ruff не всегда заменит все инструменты. Если проект строго привязан к Black, и команда не готова менять форматирование, то совместное использование возможно, но требует дополнительных настроек. Также Ruff пока не обеспечивает полную замену некоторых специализированных плагинов flake8.

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

Мой опыт внедрения Ruff

В одном из проектов мы заменили связку flake8 + isort на Ruff и заметно ускорили локальные проверки. Команда сначала волновалась насчёт изменений в стиле, но запуск ruff —fix локально и последующая правка PR показали, что миграция проходит плавно.

Были случаи, когда Ruff предлагал формат, отличный от привычного Black. Мы обсуждали такие изменения в код-ревью и оставляли соответствующие правила как исключения. В итоге мощная автоматизация и уменьшение времени ожидания проверок окупили первоначальные усилия на настройку.

Практические советы при внедрении

Начинайте с режима проверки без автопоправок, чтобы увидеть список предупреждений и оценить объём изменений. Это даст представление о том, какие правила нужно отключить или адаптировать под проект. Затем постепенно включайте автоматические исправления в локальном режиме.

Добавьте Ruff в pre-commit или CI, чтобы новые коммиты соответствовали принятым правилам. Pre-commit полезен тем, что предотвращает попадание очевидных нарушений в репозиторий, не требуя ручной проверки каждого PR.

Заключительная мысль

Ruff — инструмент, который заслуживает внимания: он быстрый, гибкий и способен уменьшить количество отдельных утилит в рабочем окружении. Это не универсальное решение для всех случаев, но для многих команд переход на Ruff даёт ощутимый выигрыш в скорости и удобстве.

Если вы работаете с большими кодовыми базами или стремитесь упростить набор проверок, стоит попробовать Ruff в тестовой ветке проекта и посмотреть, насколько он вписывается в ваш рабочий процесс.