Содержимое
Ruff: современный и быстрый linter + formatter для Python Правила оформления кода закреплены в стандартах: какие нужны отступы, длина строк и названия переменных. Они делают код разработчика понятным и единообразным. Правила бывают внутренними (для конкретного проекта) или общими. Например, в Python главный стандарт — PEP8. Привести код в нужный формат, например, под PEP8 — задача, которая может занять много времени. Поэтому были разработаны вспомогательные инструменты — linters и formatters. 🔜Linter выполняет статический анализ кода, проверяя его на соответствие заданным правилам, например, PEP8 или пользовательским. 🔜Formatter автоматически преобразовывает внешний вид кода, не затрагивая его логику и приводя в соответствие заданному стилю оформлению. Linter и formatter безопасно исправляют код, не меняя его поведения. Они упрощат жизнь разработчка и помогают избежать споров о форматировании и правильности именования классов во время ревью, экономя участникам время и нервы 🙂. Разработчик вызовом одной команды автоматически форматирует код и находит конкретные участки, которые не соответствуют принятому стандарту, чтобы их поправить. А ревьювер не тратит силы на проверку форматирования, если в CI MR прошёл этапы linter и formatter, уделяя всё внимание на ревью реализации функционала. Основной linter для python — flake8, а formatters — isort и black. Каждый из них имеет свою конфигурацию и команду запуска. Использование нескольких инструментов вызывает ряд неудобств: 1. Отдельные файлы конфигураций замусоривают корень проекта и могут конфликтовать между собой. 2. Каждый инструмент — отдельная зависимость, которую надо установить. Кроме того, для flake8, как правило, необходимо доустанавливать отдельные плагины. 3. Каждый инструмент запускается отдельным процессом / задачей в CI и может работать относительно долго на больших кодовых базах. Ruff помогает избавиться от них: он ставится одним python package, правила для форматирования и различных linters описываются в одном конфиге, а реализация на Rust делает его быстрее аналогов🚀. Пример внедрения ruff в проект В pyproject.toml добавляются следующие строки: [tool.ruff] # Общие настройки ruff extend-exclude = ["*.ipynb"] # Исключаем Jupyter-ноутбуки из проверки line-length = 120 # Лимит длины строки lint.select = [ # Добавляем правила из списка https://docs.astral.sh/ruff/rules "E", # pycodestyle "F", # pyflakes "I", # isort ] lint.ignore = [ "F821", # Пример добавления игнорирования правил ] [tool.ruff.format] # Отдельные настройки форматтера quote-style = "double" # Перевод одинарных кавычек в двойные indent-style = "space" # Перевод табов в пробелы В .pre-commit-config.yaml добавляются следующие строки: repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.7 hooks: - id: ruff types_or: [ python, pyi, jupyter ] - id: ruff-format types_or: [ python, pyi, jupyter ] args: [ "--check", "--diff" ] Далее: # Устанавливаем зависимости pip install pre-commit ruff # После настройки linter и formatter создаем hooks для commit/push pre-commit install # Использование ruff check --fix # Запустит linter, подсветит ошибки и исправит некоторые ошибки ruff format # Запустит formatter и отформатирует код Автор: Иван Перминов Про форматтеры, линтеры и другие инженерные практики, помогающие навести порядок в репозиториях DL-инженеров, рассказываем на курсе «Деплой DL-сервисов»⚡️