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 в тестовой ветке проекта и посмотреть, насколько он вписывается в ваш рабочий процесс.

