Найти тему
Nuances of programming

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

Оглавление

Источник: Nuances of Programming

Благодаря легко читаемому и понятному синтаксису 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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

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

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

Читайте нас в Telegram, VK

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