Ruff 0.16.0 расширил набор правил по умолчанию до 413

Astral выпустила Ruff 0.16.0, новую версию быстрого линтера и форматировщика Python, написанного на Rust. В проекте считают, что Ruff может заменить Black, Flake8 с десятками плагинов, isort, pydocstyle, pyupgrade и другие отдельные инструменты, выполняясь в десятки или сотни раз быстрее каждого из них.
Главное изменение релиза, новый набор правил по умолчанию: теперь включены 413 правил вместо прежних 59. С момента последнего изменения этого набора в Ruff 0.1.0 общее число правил выросло с 708 до 968. По сообщению разработчиков, среди ранее не включённых правил были проверки серьёзных проблем, включая синтаксические ошибки и ошибки, которые проявляются сразу во время выполнения. Пользователь может вернуть прежний набор, явно выбрав группы E4, E7, E9 и F в настройке lint.select.
Ruff 0.16.0 стабилизирует форматирование Python-блоков в Markdown: форматируются ограждённые блоки с пометками python, py, python3, py3, pyi и pycon. Блоки pyi обрабатываются как файлы заглушек типов, pycon, как сеансы интерактивной консоли; также поддерживаются блоки Quarto с пометкой {python}. Форматирование можно отключать комментариями fmt: off и fmt: on внутри блока, HTML-комментариями для фрагмента документа или исключением Markdown-файлов через extend-exclude.
В релиз вошли комментарии ruff: ignore для подавления диагностики на той же строке либо на следующей логической строке, а также ruff: file-ignore для подавления диагностик во всём файле. К ним можно добавлять причину. Новый параметр командной строки --add-ignore умеет добавлять ruff: ignore автоматически; в режиме предварительных функций эти комментарии поддерживают имена правил вместо кодов.
Также Ruff теперь показывает различия, которые внесли бы исправления линтера и форматировщика, в обычном полном выводе check и format --check. Для format --check доступны форматы вывода линтера, в том числе машиночитаемый JSON и форматы аннотаций для GitHub и GitLab. При этом в JSON-выводе некоторые поля расположения и имени файла могут стать null вместо прежних пустой строки и позиции 1:1. Ряд правил и отдельных режимов проверки вышел из предварительного режима.
Ключевые факты
- В Ruff 0.16.0 по умолчанию включены 413 правил вместо 59; всего в проекте 968 правил против 708 на момент Ruff 0.1.0.
- Среди добавленных правил есть проверки синтаксических и немедленных ошибок времени выполнения; прежний набор можно вернуть через lint.select с группами E4, E7, E9 и F.
- Форматировщик теперь обрабатывает Python-блоки в Markdown, включая блоки Quarto с пометкой {python}.
- Появились комментарии ruff: ignore и ruff: file-ignore, а параметр --add-ignore может добавлять подавление автоматически.
- Команды check и format --check показывают различия предлагаемых исправлений в полном выводе; часть полей JSON-диагностик теперь может быть null.
Почему это важно
Ruff меняет поведение без дополнительной настройки: число активных по умолчанию проверок выросло с 59 до 413. Это позволяет увидеть больше проблем в существующем коде, в том числе синтаксические ошибки и ошибки, возникающие сразу при запуске.
Кому это важно
Обновление относится к командам и разработчикам Python, использующим Ruff как линтер или форматировщик. Особенно заметным оно будет для проектов, которые полагались на набор правил по умолчанию, а также для тех, кто хранит примеры Python в README, другой Markdown-документации или Quarto-ноутбуках.
Как это применить
Обновить Ruff можно из PyPI или через менеджер пакетов. Если новый набор проверок создаёт слишком много изменений, прежнее поведение возвращается настройкой lint.select = ["E4", "E7", "E9", "F"]. Для Markdown можно запускать ruff format; отдельные фрагменты отключаются парами fmt: off и fmt: on, а диагностики, комментариями ruff: ignore или ruff: file-ignore.
Можно ли доверять
Это анонс Astral, компании-разработчика Ruff, с описанием изменений, примерами конфигурации и ссылками на документацию и полный список изменений. Утверждения в материале отражают позицию разработчиков релиза.
Риски и подводные камни
В релизе есть небольшое число ломающих изменений. Основной риск, новые правила по умолчанию могут выявить уже существующие нарушения и изменить результаты проверок в непрерывной интеграции. Кроме того, потребителям JSON-вывода нужно учесть, что имя файла и поля расположения диагностики теперь иногда равны null, а не получают прежние значения по умолчанию.