Если кто ещё не знает, то
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 потерял несколько ошибок в других правилах, но тут я даже хз. Мне лень искать эти несколько потерянных ошибок среди сотен найденных.Вердикт: недостатка правил тут точно нет, есть небольшая разница в том, как правила работают. Критична ли эта разница? Для меня скорее нет.