Ruff можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Ruff объединяет быстрый линтер и форматтер, поэтому новичку не нужно собирать длинную цепочку отдельных инструментов. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.
Python-файл может запускаться и при этом содержать неиспользуемые импорты, неоднозначные имена и стиль, который мешает ревью. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте мини-проект с настройкой в pyproject.toml, намеренной ошибкой и командами автоматического исправления. Проверка: первая проверка находит проблемы, команда --fix исправляет безопасные случаи, а повторный запуск завершается без замечаний.
зафиксировать правила и длину строки в pyproject.toml. Не расширяйте проект до первого успешного запуска.
терминал выводит код правила и номер строки. Проверяйте значение, а не отсутствие ошибки.
После успеха добавьте правило сортировки импортов и намеренно поменяйте их порядок. Так копирование станет практикой.
Как устроен учебный проект Ruff
Ruff читает конфигурацию из корня проекта, строит список диагностик для Python-файлов и отдельно применяет форматирование. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.
| Этап | Действие | Проверяемый результат |
|---|---|---|
| Конфигурация | зафиксировать правила и длину строки в pyproject.toml | Ruff показывает активную конфигурацию проекта |
| Проверка | запустить ruff check для файла с намеренной ошибкой | терминал выводит код правила и номер строки |
| Исправление | применить только безопасные правки через --fix | лишний импорт исчезает, а логика функции не меняется |
| Форматирование | запустить ruff format и повторную проверку | файлы отформатированы, ruff check завершается с кодом 0 |
Контрольные точки: конфигурация, проверка, исправление и форматирование. Следующий шаг начинается после совпадения с ожидаемым результатом.

От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.
ruff check app.py до автоисправления и убедитесь, что видите диагностику F401 для неиспользуемого импорта. Сохраните команду запуска и ожидаемый вывод.Собираем рабочий пример шаг за шагом
Пример сверялся с актуальной документацией официальной документации Ruff на 19 октября 2026 года. Установите инструмент командой uv tool install ruff либо запускайте без установки через uvx ruff. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.
mkdir ruff-demo && cd ruff-demo
cat > pyproject.toml <<'TOML'
[tool.ruff]
line-length = 88
[tool.ruff.lint]
select = ["E", "F", "I", "B"]
TOML
cat > app.py <<'PY'
import os
def total(prices: list[int]) -> int:
return sum(prices)
print(total([120, 80, 300]))
PY
uvx ruff check app.py
uvx ruff check app.py --fix
uvx ruff format app.py
uvx ruff check app.py- Первый запуск сообщает, что импорт
osне используется. - После
--fixимпорт удалён, а программа по-прежнему печатает500. - Повторный запуск даёт тот же предсказуемый результат.
- Пустой ввод получает понятное сообщение вместо падения.
Команда check отвечает за правила качества, а format приводит расположение пробелов и переносов к одному стилю. Найдите в примере вход, проверку и место формирования результата.

Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.
Что происходит внутри и почему это работает
Каждое сообщение Ruff содержит код правила, например F401. По коду легко открыть объяснение, понять риск и решить, нужна ли автоматическая правка. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Флаг --fix не означает «переписать программу». Ruff применяет только исправления, которые конкретное правило помечает как доступные; остальные замечания остаются в отчёте.
| Часть | За что отвечает | Что проверить |
|---|---|---|
| pyproject.toml | хранит единые правила для редактора, терминала и CI | Ruff запускается из вложенной папки и всё равно находит конфигурацию |
| ruff check | ищет ошибки, плохие импорты и выбранные категории правил | диагностика содержит файл, строку и стабильный код |
| ruff format | переформатирует исходник без изменения поведения | git diff показывает только оформление |
Начните с небольшого набора E, F, I и B. Не включайте сотни правил вслепую: старый проект может получить тысячи замечаний, которые ничего не учат. Для существующего кода сначала зафиксируйте текущий уровень, затем добавляйте категории по одной. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.
sys, не используйте его и снова выполните проверку. Затем исправьте только этот случай. Меняйте одно условие за прогон, чтобы видеть причину.Проверяем проект и добавляем свою функцию
Подключите Ruff к своему маленькому Python-проекту и сравните код до и после форматирования через git diff. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.
- Сохраните ожидаемый результат: первая проверка находит проблемы, команда
--fixисправляет безопасные случаи, а повторный запуск завершается без замечаний. - Измените правило: добавьте правило сортировки импортов и намеренно поменяйте их порядок. Сначала предскажите итог.
- Передайте граничное значение и убедитесь, что приложение не падает.
- Верните корректные данные и объясните роли трёх основных частей.
- Ruff показывает активную конфигурацию проекта
- терминал выводит код правила и номер строки
- лишний импорт исчезает, а логика функции не меняется
- файлы отформатированы, ruff check завершается с кодом 0
Ruff полезен не количеством правил, а короткой обратной связью: ошибка появляется рядом со строкой до того, как попадёт в ревью. Полезная правка проходит от нового ввода до видимого результата.

Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.
Что запомнить и куда двигаться дальше
Оставьте в README три команды: проверка, исправление и форматирование. Позже ту же проверку можно перенести в GitHub Actions, не меняя конфигурацию. Для закрепления откройте в статье про uv и окружение Python, в первых тестах pytest и в настройке Ruff через GitHub Actions.
Как изучить тему в Кодике
Сначала отделите синтаксис Python от инструментов качества: напишите чистую функцию, проверьте её результат, а затем добавьте линтер. Сначала восстановите главную функцию и проверьте её на трёх значениях.
| Шаг | Что разобрать | Мини-проверка |
|---|---|---|
| 1. Основа | Функции, импорты, аннотации типов и исключения Python | Объясните вход и выход функции. |
| 2. Инструмент | Коды диагностик Ruff, конфигурацию TOML и разницу check/format | Повторите команду по памяти. |
| 3. Проект | Проверку папки src и исключение сгенерированных файлов | Проверьте два сценария. |
| 4. Рефакторинг | Одну команду quality в локальном скрипте и CI | Разделите ввод, логику и вывод. |
После этого попробуйте объяснить, почему форматтер не заменяет тесты, а линтер не доказывает правильность бизнес-логики. Базовый синтаксис закрепите через курс Python.
Конфигурация не найдена или применяется другой pyproject.toml. Выполните команду из корня и проверьте ruff config.
Шум скрывает полезные замечания. Начните с E, F, I и B, затем расширяйте список осознанно.
Без просмотра изменений легко пропустить неожиданную правку. Всегда смотрите git diff.
Статическая проверка не знает ожидаемые суммы и сценарии пользователя. Тесты остаются отдельным слоем.
Что получится в итоге

Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.
Чем ruff check отличается от ruff format?
Первая команда применяет правила линтера и показывает диагностики, вторая меняет оформление кода по единому стилю.
Что означает F401?
Это стабильный код правила для импортированного, но неиспользуемого имени. По нему можно найти точное объяснение.
Что проверять первым, если Ruff не запускается?
Версию среды, текущую папку, команду запуска и первую строку ошибки.
Как понять, что проект Ruff работает?
Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.
Можно ли начать с готового кода?
Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.
Выберите одно улучшение и проведите его от ввода до результата.
Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.