У кода есть множество разных характеристик, по которым можно судить, насколько хорошо он написан. Среди них есть одна базовая, с которой начинают все разработчики — это стиль написания.
Сравните два варианта оформления кода:
## Без форматирования
def find_sum(a,b):
c = a+b; return c
## С форматированием
def find_sum(a, b):
sum = a + b
return sum
Второй вариант читается значительно проще. Чем больше будет кода, тем больше будет различий. Хороший стиль кодирования — базовое требование к коду в коммерческой разработке, потому что он упрощает командную разработку. В одном проекте может работать несколько десятков программистов. Важно, чтобы им было легко читать код друг друга, не спотыкаясь о неправильное форматирование.
Для отслеживания подобных ситуаций существуют линтеры — особый класс программ. Линтеры содержат большое количество правил, по которым они могут выдать рекомендации по коду. Другими словами, они подсказывают, как стоит писать код, а как — не стоит. Более того, часто линтеры расширяются плагинами под конкретные фреймворки, что позволяет отслеживать специфичные ошибки и давать рекомендации по кодированию в этих фреймворках.
В Python в последнее время особой популярностью пользуется линтер ruff. Количество правил, по которым он проверяет код, исчисляется десятками. Посмотрите на этот небольшой участок кода:
from math import sqrt
def sum(a, b):
c = 5
return a + b
С точки зрения форматирования здесь все хорошо, а что скажет линтер?
- F401 'math.sqrt' imported but unused. Модуль импортируется, но не используется — либо он не нужен, либо в коде есть ошибка
- F841 local variable 'c' is assigned to but never used. Переменная не используется — либо она не нужна, либо в коде ошибка
Ссылки выше ведут на страницы конкретных правил. Там подробно объясняется, почему так код писать не нужно. Изучать правила линтеров очень полезно, они прививают хорошие практики написания кода.
Установка и настройка ruff
Линтер ruff устанавливается как dev зависимость прямо в проект:
uv add --dev ruff
После установки его можно настроить под набор ваших правил и ограничений. Для этого нужно создать файл конфигурации ruff.toml, который нужно добавить в репозиторий. Ниже пример такого файла, который используется для настройки линтера в наших практиках:
line-length = 80
[lint.per-file-ignores]
# init modules can contain the local imports, logic, unused imports
"__init__.py" = ["F401"]
[lint]
preview = true
select = ["E", "F", "I", "C90"]
Выше настраивается максимальная длина строчки кода, какие файлы не нужно проверять линтером или какие правила можно игнорировать. Также в поле select
перечисляются группы, используемых правил.
Наборы правил, которыми пользуются линтеры, называют стилевым стандартом или стайлгайдом. В Python самый первый стайлгайд был описан в документе PEP8. С тех пор язык сильно вырос, стал использоваться в продакшене и приобрел множество новых фич. Потому появилось много расширений правил PEP8, добавляющих новые проверки. Современные линтеры используют наборы разных групп правил. Наиболее частые это "E", "F", "I" и "C90". Вы можете почитать какие проверки они добавляют на странице правил.
Наконец, последний шаг — запуск ruff
:
# Обратите внимание на точку
# Это указание текущей директории и всех поддиректорий
uv run ruff check .
Если ошибок нет, то ruff
молча завершит свою работу. Если ошибки есть, линтер выведет список с указанием того, что нужно поправить.
Кроме нахождения ошибок ruff
может их исправлять. По крайней мере те ошибки, которые могут быть исправлены с гарантией сохранения работоспособности. Для этого нужно добавить флаг --fix
в запуск:
uv run ruff check --fix .
Самостоятельная работа
- Установите
ruff
в ваш проект - Создайте файл конфигурации и скопируйте в него настройки из нашего эталонного репозитория
- Запустите линтер на файлах проекта, исправьте замечания
- Если вы сохраняли код на GitHub, то отправьте изменения и
ruff.toml
в репозиторий
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.