Про ruff (2/5)
Если кто ещё не знает, то ruff
— это очень быстрый линтер для Python, написанный на Rust.
Давайте начнём разбираться по порядку — сначала про набор правил и про их качество.
С дефолтными настройками ruff
повторяет функционал flake8
. Вообще, в этом линтере довольно много идей унаследовано именно из flake8
, например, настройки очень похожи, названия правил совпадают один к одному. Похоже, ruff
позиционируется в первую очередь как замена flake8
— у них даже тулза для миграции есть, которая переносит все настройки.
Но, кроме дефолтных правил flake8
, в комплекте уже заимплеменчена куча различных других правил, которые повторяют значительную часть популярных плагинов для flake8
, вообще имплементации просто каких-то других инструментов, а также есть немного своих собственных правил. Да, в ruff
уже в комплекте есть большинство правил из pylint
, есть сортировщик импортов, который фактически заменяет isort
, есть mccabe
, bandit
, pyupgrade
. Из того, что я люблю тут есть flake8-bugbear
, flake8-pytest-style
, flake8-logging-format
и другие хорошие плагины. Это всё уже прям встроено внутрь ruff
, нужно лишь включить эти правила в конфиге. И да, это всё написано на Rust, как и сам линтер. Автор настолько упоролся, что переписал заново кучу популярных плагинов на другом языке, и он продолжает это делать постоянно. Сейчас у ruff
в сумме уже около 400 правил и 44 набора правил. Велика вероятность, что здесь уже есть всё, чем вы пользуетесь. Либо это здесь совсем скоро появится, учитывая скорость развития инструмента.
Я взял большой рабочий проект примерно на 500к строк кода (это много) и запустил на нём flake8
и ruff
, предварительно их чуть поднастроив (увеличил длину строки, отключил некоторые правила, которые противоречат black
). Результат запуска видно на скрине ниже. Вывод у двух утилит почти идентичен, кроме лишь того, что ruff
вставляет в вывод звёздочки [*]
, про которые я отдельно расскажу чуть позже.
Сумма ошибок слегка не сходится — flake8
находит больше проблем. Предполагаю, что это потому что правило E501
в ruff
работает по принципу black
, а не строго, как в оригинальном flake8
. То есть ruff
позволяет слегка выходить за ограничение по длине строки так же, как это делает black
. Линтер заточен именно под использование в связке с black
. Они даже не стали имплементить большинство проверок, связанных с неправильной расстановкой пробелов, потому что в наш век автоформаттеров эти правила уже не имеют никакого смысла. Этими пробелами в коде всё равно управляет не человек. Ещё ruff
потерял несколько ошибок в других правилах, но тут я даже хз. Мне лень искать эти несколько потерянных ошибок среди сотен найденных.
Вердикт: недостатка правил тут точно нет, есть небольшая разница в том, как правила работают. Критична ли эта разница? Для меня скорее нет.
>>Click here to continue<<