БэкендDevOpsPython

Ruff для Python: как за минуту отформатировать код и найти ошибки

Настраиваем Ruff в Python-проекте: проверяем ошибки, сортируем импорты, форматируем код и подключаем одну команду для ежедневной работы.

Кодик

Автор

6 мин чтения

Ruff можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Ruff объединяет быстрый линтер и форматтер, поэтому новичку не нужно собирать длинную цепочку отдельных инструментов. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Python-файл может запускаться и при этом содержать неиспользуемые импорты, неоднозначные имена и стиль, который мешает ревью. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте мини-проект с настройкой в pyproject.toml, намеренной ошибкой и командами автоматического исправления. Проверка: первая проверка находит проблемы, команда --fix исправляет безопасные случаи, а повторный запуск завершается без замечаний.

1Соберите минимум

зафиксировать правила и длину строки в pyproject.toml. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

терминал выводит код правила и номер строки. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте правило сортировки импортов и намеренно поменяйте их порядок. Так копирование станет практикой.

Как устроен учебный проект Ruff

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

ЭтапДействиеПроверяемый результат
Конфигурациязафиксировать правила и длину строки в pyproject.tomlRuff показывает активную конфигурацию проекта
Проверказапустить ruff check для файла с намеренной ошибкойтерминал выводит код правила и номер строки
Исправлениеприменить только безопасные правки через --fixлишний импорт исчезает, а логика функции не меняется
Форматированиезапустить ruff format и повторную проверкуфайлы отформатированы, ruff check завершается с кодом 0

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

Путь данных в проекте Ruff
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех Запустите 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
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Каждое сообщение Ruff содержит код правила, например F401. По коду легко открыть объяснение, понять риск и решить, нужна ли автоматическая правка. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. Флаг --fix не означает «переписать программу». Ruff применяет только исправления, которые конкретное правило помечает как доступные; остальные замечания остаются в отчёте.

ЧастьЗа что отвечаетЧто проверить
pyproject.tomlхранит единые правила для редактора, терминала и CIRuff запускается из вложенной папки и всё равно находит конфигурацию
ruff checkищет ошибки, плохие импорты и выбранные категории правилдиагностика содержит файл, строку и стабильный код
ruff formatпереформатирует исходник без изменения поведенияgit diff показывает только оформление

Начните с небольшого набора E, F, I и B. Не включайте сотни правил вслепую: старый проект может получить тысячи замечаний, которые ничего не учат. Для существующего кода сначала зафиксируйте текущий уровень, затем добавляйте категории по одной. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Добавьте импорт sys, не используйте его и снова выполните проверку. Затем исправьте только этот случай. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

Подключите Ruff к своему маленькому Python-проекту и сравните код до и после форматирования через git diff. До правки запишите ожидаемое поведение одним предложением. После граничного теста повторите обычный сценарий.

Проверка своими руками
  1. Сохраните ожидаемый результат: первая проверка находит проблемы, команда --fix исправляет безопасные случаи, а повторный запуск завершается без замечаний.
  2. Измените правило: добавьте правило сортировки импортов и намеренно поменяйте их порядок. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • Ruff показывает активную конфигурацию проекта
  • терминал выводит код правила и номер строки
  • лишний импорт исчезает, а логика функции не меняется
  • файлы отформатированы, ruff check завершается с кодом 0

Ruff полезен не количеством правил, а короткой обратной связью: ошибка появляется рядом со строкой до того, как попадёт в ревью. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки 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, затем расширяйте список осознанно.

Автоисправление без diff

Без просмотра изменений легко пропустить неожиданную правку. Всегда смотрите git diff.

Ruff вместо тестов

Статическая проверка не знает ожидаемые суммы и сценарии пользователя. Тесты остаются отдельным слоем.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальной документации Ruff. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Ruff для Python: как за минуту отформатировать код и найти ошибки
Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.

Короткие ответы
Чем ruff check отличается от ruff format?

Первая команда применяет правила линтера и показывает диагностики, вторая меняет оформление кода по единому стилю.

Что означает F401?

Это стабильный код правила для импортированного, но неиспользуемого имени. По нему можно найти точное объяснение.

Что проверять первым, если Ruff не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект Ruff работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

Да. Добейтесь результата, измените одно правило и восстановите ключевую функцию без копирования.

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс Python, затем восстановите ключевую функцию без подсказки.