Добавить в корзинуПозвонить
Найти в Дзене
Цифровая Переплавка

Ruff: когда Rust помогает делать Python-код чище и быстрее

Как заставить Python-проекты «летать», когда речь заходит о линтинге и форматировании? Ответ энтузиастов: использовать Ruff. Этот невероятно шустрый инструмент, написанный на языке Rust, упрощает жизнь разработчикам, которые не хотят тратить целые минуты на проверку стиля кода или поиск неиспользуемых импортов. По сути, Ruff объединяет в себе функциональность известных Python-линтеров (Flake8 с множеством плагинов) и форматеров (Black, isort и др.). Причём делает это, судя по тестам, в 10–100 раз быстрее. 🐍 Интеграция с Python, но написан на Rust
Rust славится скоростью, безопасностью работы с памятью и возможностью эффективно параллелить операции. Разработчики Ruff реализовали множество проверок как «нативные» модули, и поэтому, в отличие от связки «Flake8 + плагины на Python», Ruff стартует и отрабатывает заметно быстрее. ⚡ Универсальность (линтер + форматер)
Проекты зачастую используют несколько инструментов: Flake8 (чтобы искать ошибки в коде), Black (чтобы выравнивать стиль), iso
Оглавление

Как заставить Python-проекты «летать», когда речь заходит о линтинге и форматировании? Ответ энтузиастов: использовать Ruff. Этот невероятно шустрый инструмент, написанный на языке Rust, упрощает жизнь разработчикам, которые не хотят тратить целые минуты на проверку стиля кода или поиск неиспользуемых импортов. По сути, Ruff объединяет в себе функциональность известных Python-линтеров (Flake8 с множеством плагинов) и форматеров (Black, isort и др.). Причём делает это, судя по тестам, в 10–100 раз быстрее.

Чем Ruff отличается от прочих инструментов

🐍 Интеграция с Python, но написан на Rust
Rust славится скоростью, безопасностью работы с памятью и возможностью эффективно параллелить операции. Разработчики Ruff реализовали множество проверок как «нативные» модули, и поэтому, в отличие от связки «Flake8 + плагины на Python», Ruff стартует и отрабатывает заметно быстрее.

Универсальность (линтер + форматер)
Проекты зачастую используют несколько инструментов: Flake8 (чтобы искать ошибки в коде), Black (чтобы выравнивать стиль), isort (чтобы упорядочивать импорты) и так далее. Ruff по идее заменяет большую часть этих утилит из интерфейса командной строки (CLI):

  • умеет выявлять проблемы (unused imports, неправильные конструкции и прочее),
  • автоматически подчищать их,
  • форматировать код в стиле, близком к Black (или вашем кастомном).

🎯 Не нужно писать конфигурации для каждого отдельного плагина
Ruff предоставляет сразу более
800 встроенных правил, многие из которых — прямые порты известных Flake8-плагинов (типа flake8-bugbear, flake8-docstrings, flake8-import-conventions) и инструментов вроде pyupgrade, isort, pydocstyle. Вместо того, чтобы ставить 10–15 пакетов и следить за их несовместимостями, достаточно настроить один Ruff.

Технические нюансы и фишки конфигурации

🛠️ Конфиг можно положить в pyproject.toml
Чтобы хранить все настройки в одном месте, разработчики предлагают использовать стандартную секцию [tool.ruff] (или рядышком .ruff.toml, если так удобнее). Тут вы можете прописать:

  • какие правила включать или исключать,
  • как форматировать строки (одинарные или двойные кавычки),
  • какую версию Python считать целевой (например, py39).

📂 Поддержка монорепозиториев
Если ваш проект разбит на отдельные сервисы (директории), в Ruff есть механизмы иерархических и каскадных конфигов, чтобы каждая часть проекта жила по-своему, но общий линтинг при этом оставался единообразным.

⚙️ Опция —fix
Благодаря Rust-ядру Ruff может быстро «убирать» опечатки в коде, удалять неиспользуемые импорты (аналог autoflake), перестраивать структуры и даже обновлять устаревшие Python-конструкции в духе pyupgrade. Запускаете ruff check --fix, и Ruff правит код автоматически.

Личное мнение: почему Ruff действительно впечатляет

Я всегда относился к линтерам как к неизбежному «злу», которое заставляет меня ждать. Бывало, что Flake8+plugins мог забирать по 20–30 секунд при большой кодовой базе, а если добавить «долгоиграющие» инструменты вроде pylint, ожидание могло доходить до нескольких минут.
Но
в Rust всё иначе: статически скомпилированный бинарный файл даёт колоссальный буст при анализе кода на Python. Ruff стартует молниеносно и почти не «думает» между проверками. И это настолько непривычно, что авторы (и многие пользователи) признаются: «Сперва я нарочно делал ошибку, чтобы убедиться, что Ruff вообще работает!»

Интересные факты

💻 Поддерживается установка через pip, pipx, Homebrew, Conda и даже standalone-инсталляторы (скрипты curl для Unix-систем или PowerShell-скрипт для Windows).
🧪
Ruff — не только линтер, но и форматер: отдельная команда ruff format пытается сделать ваш код приятным и единообразным.
🖥️
Поддержка редакторов: есть расширения для VS Code, а также интеграции с другими IDE.
🌍
Уже в бою используют: Apache Airflow, FastAPI, Hugging Face, Pandas, SciPy, и многие другие крупные проекты открыто перешли на Ruff.

Как начать работать с Ruff

🤖 Установка:

pip install ruff
# или
pipx install ruff

Либо воспользуйтесь более продвинутым пакетным менеджером uv.

🔍 Запуск проверки:

ruff check path/to/code

или

ruff format path/to/code

— если нужно именно отформатировать.

В файл конфигурации pyproject.toml (секция [tool.ruff]) или ruff.toml вы можете добавить интересующие правила, например:

[lint]
select = ["F", "E", "B", "W"]
ignore = ["E501"] # Например, игнорируем проверку длины строки

🔑 Полезные ссылки:

Заключение
Ruff — отличный пример того, как Rust в сочетании с идеями Python-мира может превратить рутину в нечто гораздо более приятное. Это быстрый, гибкий и всё в одном пакет: линтер, форматер, мега-пакет плагинов. Если вы чувствуете, что ваш Flake8 на пару со сторонними модулями уже не справляется или «съедает» слишком много времени, стоит присмотреться к Ruff. Скорее всего, он покрывает все ваши нужды, а заодно высвободит немало минут или даже часов при больших кодовых базах.

Попробуйте — и вы сами почувствуете разницу: ведь всегда здорово, когда инструменты помогают фокусироваться на главном, а не отвлекаться на долгие ожидания.