Ruff

Материал из llmdocs — справочник разработчика
Портал: Python
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.

См. также

Источники

  1. Ruff — документация
  2. Ruff — Rules
  3. Ruff — The Ruff Formatter
  4. Ruff — Configuring Ruff
  5. astral-sh/ruff — GitHub
  6. astral-sh/ruff-pre-commit