Обзор инструментов для автоформатирования кода Python

Благодаря легко читаемому и понятному синтаксису Python вполне обоснованно стал самым востребованным языком программирования на сегодняшний день. Области его применения настолько разнообразны, что программная инженерия, машинное обучение и наука о данных используют его для решения самых разных сложных задач. 

Один из немаловажных, но оставленных без должного внимания аспектов в написании чистого кода Python заключается в необходимости его качественного форматирования и проверок. 

Достаточно сказать, что автоматизация коснулась всех сторон современной жизни, и нам не составит особого труда привнести ее и в процесс ревью кода.

В нашем распоряжении есть несколько инструментов, позволяющих сэкономить драгоценное время и умственную энергию, чтобы вложить их в более важные дела, чем форматирование кода перед каждым git commit.

Перечислим некоторые из них:

  • хуки pre-commit;
  • black;
  • isort.

Рассмотрим поочередно каждый инструмент и научимся настраивать их для проекта Python. 

Установка и применение хуков pre-commit 

Хуки pre-commit делают ровно то, что указано в названии: запускают определенные скрипты, которые проверяют код на наличие ошибок и конечных пробелов, активируют инструменты форматирования и проводят другие полезные проверки в процессе ревью. 

Мы исключим из сферы нашего внимания обычные хуки, а сосредоточимся только на двух важных из них.

Начнем с установки библиотеки (учитывая, что вы уже работаете в виртуальной среде): 

pip install pre-commit

После установки проверяем версию с помощью данной команды. Если все работает должным образом, на выводе получаем номер версии. 

$ pre-commit --version

pre-commit 2.17.0

Примечание. Для простой настройки инструментов автоформатирования необходимо наличие конфигурационного файла git в корневом каталоге проекта. 

Именно этим мы сейчас и займемся. 

Настройка конфигурационного файла 

Согласно документации в проекте должен быть конфигурационный файл pre-commit с именем .pre-commit-config.yaml

Теперь воспользуемся фрагментом кода с информацией о хуках, с которыми мы хотим работать. Прямо сейчас мы намерены запустить 2 из них: black и isort в файлах Python перед каждым коммитом.

А вот и их настройки: 

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
hooks:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/psf/black
rev: 21.12b0
hooks:
- id: black
- repo: https://github.com/pycqa/isort
rev: 5.10.1
hooks:
- id: isort
name: isort (python)

Проведем построчный анализ:

  • Строки 5–7: Первая строка id пытается загрузить все файлы yaml для проверки синтаксиса; вторая  —  следит за тем, чтобы файлы заканчивались переводом строки и только одним; третья  —  проверяет наличие конечных пробелов.  
  • Строки 8–10: Настройка хука для black, который автоматически форматирует код Python и широко применяется во всей индустрии. 
  • Строки 12–16: Настройка для библиотеки isort, которая автоматически сортирует импорты в коде, избавляя программистов от необходимости делать это вручную. 

С помощью следующей команды присоединяем их к конфигурации git, чтобы обеспечить их запуск перед каждым коммитом:

$ pre-commit install
pre-commit installed at .git/hooks/pre-commit

Без особых усилий мы успешно настроили хуки pre-commit для проекта! 

Переходим к настройке black и isort. К счастью, для этого потребуется всего один конфигурационный файл. 

Установка и настройка black и isort

Легко и просто устанавливаем эти две библиотеки: 

pip install black isort

Из отлично написанной документации мы узнаем о назначении Black

Black ускоряет процесс ревью кода, производя минимальные возможные различия. Код, отформатированный в Black, выглядит одинаково независимо от проекта, который вы читаете. Со временем принципы форматирования становятся понятными, что позволяет сосредоточиться на содержании. 

isort также просто определяет области своего применения: 

isort —  это утилита/библиотека Python для сортировки импорта по алфавиту с автоматическим разделением на разделы и по типам. 

Для настройки потребуется всего один файл pyproject.toml.

Размещаем в нем следующий контент: 

[tool.black]
line-length = 109
target-version = ['py37']

[tool.isort]
profile = "black"

Вы можете менять не только длину строки в соответствии с личными или рабочими предпочтениями, но и другие настраиваемые переменные, предлагаемые Black

Теперь поясним, почему мы непосредственно задействуем этот конкретный файл: 

PEP 518 определяет pyproject.toml как конфигурационный файл, содержащий требования к системе сборки для проектов Python. 

На практике данный файл в корневом каталоге проекта позволяет использовать “глобальную” конфигурацию проверки/ревизии кода для всего проекта. 

Приступаем к их тестированию! 

Тестирование хуков pre-commit

Написав или отредактировав код в нескольких файлах, выполняем дальнейшую последовательность простых действий, чтобы протестировать работоспособность прикрепленных хуков. 

Сначала добавляем файлы или их комбинацию с помощью команды git add . в терминале. 

Я провожу тестирование в одном из моих текущих проектов Django

Выполняем git commit -m “a message here” и видим следующий результат: 

Первый запуск хуков pre-commit

Это значит, что файлы были изменены путем форматирования, выполненного хуком pre-commit

При выполнении команды git status получаем следующее сообщение: 

Файлы, измененные в результате запуска хуков

Файл views.py содержит несколько строк, измененных в результате выполнения хуков. Их следует просмотреть. 

Так мы убедимся, что измененные файлы не будут автоматически зафиксированы. Это позволит просмотреть их еще раз и проверить корректность всех изменений. 

В качестве преднамеренного шага pre-commit никогда не изменит область staging (подготовки к коммиту) версионного кода. Поскольку любой запускаемый хук может содержать ошибки, исправление которых после совершенного коммита обернется головной болью, нам предоставляется дополнительная возможность еще раз проверить и убедиться, что все в порядке. 

Снова добавляем и фиксируем изменения в файлах: 

git add .
git commit -m "your message here"

Полученный результат:

Все хуки пройдены! 

Итак, мы успешно зафиксировали внесенные в код изменения!

Заключение 

Надеюсь, это краткое руководство дало вам представление о том, как использовать хуки pre-commit для автоформатирования без усилий и ручного вмешательства. 

Полезные ресурсы 

Благодарю за внимание! 🙂

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Yash Prakash: The Easy Python Auto-code Formatting Guide

Предыдущая статьяЯвляется ли Bun следующим значительным достижением после WebPack?
Следующая статьяКак выжать максимум из предобученных языковых моделей с GroupBERT