Ruff
| Тип | линтер и форматер кода Python |
|---|---|
| Автор | Чарли Марш (Astral) |
| Первый выпуск | 2022 |
| Язык | Rust |
| Лицензия | MIT |
| Правил | более 800 |
| Заменяет | Flake8 и плагины, isort, pyupgrade, pydocstyle, autoflake, Black |
| Сайт | docs.astral.sh/ruff |
Ruff — линтер и форматер кода для Python, написанный на Rust. Линтер находит ошибки и подозрительные места — неиспользуемые импорты, необъявленные имена, изменяемые значения по умолчанию, устаревший синтаксис, — а форматер приводит код к единому стилю. Главная особенность Ruff — скорость: он работает в десятки и сотни раз быстрее инструментов на Python, проверяя крупный проект за доли секунды, поэтому его можно запускать при каждом сохранении файла.[1]
Ruff объединяет в одном инструменте функции целого набора утилит: Flake8 с плагинами, isort, pyupgrade, pydocstyle, autoflake и форматер Black. Его используют FastAPI, pandas, Apache Airflow и тысячи других проектов.
История
Чарли Марш выпустил первую версию в августе 2022 года как эксперимент: можно ли переписать линтер Python на Rust и сделать его на порядки быстрее. Проект быстро набрал популярность, и Марш основал компанию Astral, которая развивает инструменты для Python на Rust: в 2023 году в Ruff появился форматер, совместимый с Black, в 2024 году Astral выпустила менеджер пакетов uv, а в 2025 году — анализатор типов ty.[5]
Линтер
uv add --dev ruff
uv run ruff check . # найти проблемы
uv run ruff check --fix . # исправить то, что можно исправить автоматически
uv run ruff check --watch # проверять при каждом изменении
app.py:1:8: F401 [*] `os` imported but unused
app.py:5:20: B006 Do not use mutable data structures for argument defaults
app.py:9:5: UP035 [*] `typing.List` is deprecated, use `list` instead
Found 3 errors.
[*] 2 fixable with the `--fix` option.
Правила сгруппированы по префиксам, повторяющим исходные инструменты:[2]
| Префикс | Источник | Что проверяет |
|---|---|---|
F |
Pyflakes | неиспользуемые импорты и переменные, необъявленные имена |
E, W |
pycodestyle | стиль по PEP 8 |
I |
isort | порядок импортов |
UP |
pyupgrade | устаревший синтаксис для выбранной версии Python |
B |
flake8-bugbear | вероятные ошибки и плохие практики |
SIM |
flake8-simplify | упрощение конструкций |
S |
flake8-bandit | проблемы безопасности |
N, D |
pep8-naming, pydocstyle | имена и строки документации |
RUF |
собственные правила Ruff | разное |
По умолчанию включены только E (частично) и F; остальные наборы подключают явно, постепенно расширяя список.
Форматер
uv run ruff format . # отформатировать
uv run ruff format --check . # только проверить (для CI)
Форматер стремится давать результат, практически идентичный Black, так что переход не меняет историю кода массово.[3] Как и Black, он почти не настраивается — это сознательное решение: споры о стиле заканчиваются, код у всех выглядит одинаково.
Настройка
Конфигурация хранится в pyproject.toml или в ruff.toml:[4]
[tool.ruff]
line-length = 100
target-version = "py313"
extend-exclude = ["migrations"]
[tool.ruff.lint]
select = ["E", "F", "I", "UP", "B", "SIM", "RUF"]
ignore = ["E501"] # длину строк контролирует форматер
[tool.ruff.lint.per-file-ignores]
"tests/**" = ["S101"] # assert в тестах разрешён
[tool.ruff.format]
quote-style = "double"
Отдельную строку можно исключить из проверки комментарием # noqa: B006, а правило RUF100 подскажет, какие подавления уже не нужны.
Интеграция
- Редакторы — официальное расширение для VS Code и языковой сервер для других редакторов: подсветка и исправления при наборе.
- pre-commit — хук
ruff-pre-commitпроверяет и форматирует изменённые файлы перед коммитом (см. Git-хуки).[6] - CI —
ruff checkиruff format --checkв конвейере CI/CD за секунды; есть готовое действие для GitHub Actions.
# .pre-commit-config.yaml
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.14.0
hooks:
- id: ruff-check
args: [--fix]
- id: ruff-format
Что Ruff не делает
Ruff не проверяет типы — для этого нужны анализаторы вроде mypy и pyright или ty — и не заменяет тесты (pytest). Он также не реализует некоторые сложные проверки Pylint, требующие анализа всей программы. Типичный набор инструментов современного проекта на Python: uv для зависимостей, Ruff для линтинга и форматирования, анализатор типов и pytest.