У кода есть множество разных характеристик, по которым можно судить, насколько хорошо он написан. Среди них есть одна базовая, с которой начинают все разработчики — это стиль написания.
Сравните два варианта оформления кода:
## Без форматирования
def find_sum(a,b):
c = a+b; return c
## С форматированием
def find_sum(a, b):
sum = a + b
return sum
Второй вариант читается значительно проще. Чем больше будет кода, тем больше будет различий. Хороший стиль кодирования — базовое требование к коду в коммерческой разработке, потому что он упрощает командную разработку. В одном проекте может работать несколько десятков программистов. Важно, чтобы им было легко читать код друг друга, не спотыкаясь о неправильное форматирование.
Для отслеживания подобных ситуаций существуют линтеры — особый класс программ. Линтеры содержат большое количество правил, по которым они могут выдать рекомендации по коду. Другими словами, они подсказывают, как стоит писать код, а как — не стоит. Более того, часто линтеры расширяются плагинами под конкретные фреймворки, что позволяет отслеживать специфичные ошибки и давать рекомендации по кодированию в этих фреймворках.
В Python особой популярностью пользуется линтер flake8. Количество правил, по которым он проверяет код, исчисляется десятками. Посмотрите на этот небольшой участок кода:
from math import sqrt
def sum(a, b):
c = 5
return a + b
С точки зрения форматирования здесь все хорошо, а что скажет линтер flake8?
Он выдаст два предупреждения:
- F401 'math.sqrt' imported but unused. Модуль импортируется, но не используется — либо он не нужен, либо в коде есть ошибка
- F841 local variable 'c' is assigned to but never used. Переменная не используется — либо она не нужна, либо в коде ошибка
Ссылки выше ведут на страницы конкретных правил. Там подробно объясняется, почему так код писать не нужно. Изучать правила flake8 очень полезно, они прививают хорошие практики написания кода.
Установка и настройка flake8
Линтер flake8 устанавливается как dev зависимость прямо в проект:
poetry add --group=dev flake8
После установки его можно настроить под набор ваших правил и ограничений. Для этого нужно создать файл конфигурации setup.cfg, который нужно добавить в репозиторий. Ниже пример такого файла, который используется для настройки линтера в наших практиках:
[flake8]
accept-encodings = utf-8
max-complexity = 6
statistics = False
max-line-length = 80
enable-extensions = G
isort-show-traceback = True
exclude = .venv,dist,build
per-file-ignores =
# init modules can contain the local imports, logic, unused imports
__init__.py: F401
[isort]
multi_line_output = 3
include_trailing_comma = true
default_section = FIRSTPARTY
line_length = 80
Выше настраивается максимальная сложность функций, максимальная длина строчки кода и другие параметры. Так же мы можем указать, какие файлы не нужно проверять линтером или какие правила можно игнорировать. Список всех опций вы можете изучить в документации.
И последний шаг — запуск flake8:
# Обратите внимание на точку
# Это указание текущей директории и всех поддиректорий
poetry run flake8 .
Если ошибок нет, то flake8 молча завершит свою работу. Если ошибки есть, линтер выведет список с указанием того, что нужно поправить.
Самостоятельная работа
- Установите flake8 в ваш проект
- Создайте файл конфигурации и скопируйте в него настройки из нашего эталонного репозитория
- Запустите линтер на файлах проекта, исправьте замечания
- Если вы сохраняли код на GitHub, то отправьте изменения и
setup.cfg
в репозиторий
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.