# Ruff

> Чрезвычайно быстрый линтер и форматер кода для Python, написанный на Rust компанией Astral; заменяет Flake8, isort, pyupgrade, Black и десятки плагинов одним инструментом.

Источник: https://llmdocs.ru/wiki/ruff/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: линтер и форматер кода Python
- **Автор**: Чарли Марш (Astral)
- **Первый выпуск**: 2022
- **Язык**: Rust
- **Лицензия**: MIT
- **Правил**: более 800
- **Заменяет**: Flake8 и плагины, isort, pyupgrade, pydocstyle, autoflake, Black
- **Сайт**: docs.astral.sh/ruff
**Ruff** — линтер и форматер кода для [Python](https://llmdocs.ru/wiki/python.md), написанный на [Rust](https://llmdocs.ru/wiki/rust.md). Линтер находит ошибки и подозрительные места — неиспользуемые импорты, необъявленные имена, изменяемые значения по умолчанию, устаревший синтаксис, — а форматер приводит код к единому стилю. Главная особенность 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](https://llmdocs.ru/wiki/uv.md), а в 2025 году — анализатор типов ty.[5]

## Линтер

```bash
uv add --dev ruff
uv run ruff check .             # найти проблемы
uv run ruff check --fix .       # исправить то, что можно исправить автоматически
uv run ruff check --watch       # проверять при каждом изменении
```

```text
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](https://llmdocs.ru/wiki/pep-8.md) |
| `I` | isort | порядок импортов |
| `UP` | pyupgrade | устаревший синтаксис для выбранной версии Python |
| `B` | flake8-bugbear | вероятные ошибки и плохие практики |
| `SIM` | flake8-simplify | упрощение конструкций |
| `S` | flake8-bandit | проблемы безопасности |
| `N`, `D` | pep8-naming, pydocstyle | имена и строки документации |
| `RUF` | собственные правила Ruff | разное |

По умолчанию включены только `E` (частично) и `F`; остальные наборы подключают явно, постепенно расширяя список.

## Форматер

```bash
uv run ruff format .            # отформатировать
uv run ruff format --check .    # только проверить (для CI)
```

Форматер стремится давать результат, практически идентичный Black, так что переход не меняет историю кода массово.[3] Как и Black, он почти не настраивается — это сознательное решение: споры о стиле заканчиваются, код у всех выглядит одинаково.

## Настройка

Конфигурация хранится в [pyproject.toml](https://llmdocs.ru/wiki/pyproject-toml.md) или в `ruff.toml`:[4]

```toml
[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-хуки](https://llmdocs.ru/wiki/git-hooks.md)).[6]
- **CI** — `ruff check` и `ruff format --check` в конвейере [CI/CD](https://llmdocs.ru/wiki/ci-cd.md) за секунды; есть готовое действие для [GitHub Actions](https://llmdocs.ru/wiki/github-actions.md).

```yaml
# .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](https://llmdocs.ru/wiki/mypy-pyright.md) или ty — и не заменяет тесты ([pytest](https://llmdocs.ru/wiki/pytest.md)). Он также не реализует некоторые сложные проверки Pylint, требующие анализа всей программы. Типичный набор инструментов современного проекта на Python: uv для зависимостей, Ruff для линтинга и форматирования, анализатор типов и pytest.

## См. также

- [PEP 8](https://llmdocs.ru/wiki/pep-8.md)
- [uv (менеджер пакетов)](https://llmdocs.ru/wiki/uv.md)
- [mypy и pyright](https://llmdocs.ru/wiki/mypy-pyright.md)
- [pyproject.toml](https://llmdocs.ru/wiki/pyproject-toml.md)
- [pytest](https://llmdocs.ru/wiki/pytest.md)

## Источники

1. [Ruff — документация](https://docs.astral.sh/ruff/)
2. [Ruff — Rules](https://docs.astral.sh/ruff/rules/)
3. [Ruff — The Ruff Formatter](https://docs.astral.sh/ruff/formatter/)
4. [Ruff — Configuring Ruff](https://docs.astral.sh/ruff/configuration/)
5. [astral-sh/ruff — GitHub](https://github.com/astral-sh/ruff)
6. [astral-sh/ruff-pre-commit](https://github.com/astral-sh/ruff-pre-commit)
