Обзор книги Claudio Jolowicz — Hypermodern Python Tooling

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Даниил Никитин

Старший разработчик ГК Юзтех

Коллеги, привет! Меня зовут Даниил Никитин, старший разработчик ГК Юзтех. У меня появилась возможность ознакомиться с ранней версией книги «Гиперсовременный инструментарий Python» ("Hypermodern Python Tooling") под авторством Клаудио Йоловича (Claudio Jolowicz). Книга планируется к релизу в апреле 2024 г., мне довелось прочитать версию от июня 2023 г. После прочтения я решил написать обзор, так как ранее мне не доводилось встречать книги на подобную тематику. 

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

На текущий момент (июнь 2023г.) в раннем доступе книга состоит из 7 разделов:

1. Установка Python;
2. Окружения (ака среда) в Python;
3. Пакеты в Python;
4. Менеджмент зависимостей;
5. Менеджмент зависимостей с Poetry;
6. Тестирование с Pytest;
7. Измерение покрытия с [Coverage.py] (http://coverage.py/).

Обзор разделов книги

В первом разделе есть описание релизного цикла выпуска версий в Python. Описаны различные способы установки для различных ОС: Windows, Linux, MacOS, применение pyenv для установки множества различных версий интерпретаторов Python, не только на базе CPython, но и PyPy, IronPython, Jython, Pyston и др. Приведен пример использования pylauncher, в том числе и для Unix систем. В качестве альтернативы приводится пример установки при помощи Anaconda.

Во втором разделе идет речь про то, как устроено окружение (или среда) в Python: интерпретатор, сценарии точек входа, модули (включающие как стандартную библиотеку, так и сторонние модули), общие библиотеки (содержащие собственный код, скомпилированный из языков низкого уровня, таких как C). Упоминается использование виртуальных окружений, которые можно создавать при помощи встроенного модуля venv, появившийся в Python3, а также различия в их активации для различных ОС. Здесь нас знакомят с менеджером пакетом, как встроенным pip, так и сторонним pipx. Дается общая информация о том, как происходит поиск модулей.

В третьем разделе перед нами открывается схема работы индекса пакетов Python. Приводится пример простейшего скрипта и показан весь ворк-флоу от создания проекта до его загрузки, как в тестовый индекс пакетов, так и в реальный. Используется файл pyproject.toml для указания мета информации при сборке пакета приложения. В качестве бекенда сборки используется современный и соответствующий стандартам менеджер проектов hatch (https://hatch.pypa.io/latest/). В качестве инструмента выгрузки пакета используется официальный инструмент загрузки PyPI: Twine. Перечислены варианты пакетов: sdists и wheels. Приводится перечень основных полей с мета информацией в файле pyproject.toml для проекта.

В четвертом разделе поднимается, наверное, самая неоднозначная проблема: проблема менеджмента зависимостей в проекте. На сцену выходят два варианта: при помощи requirements.txt c возможными вариациями и комбинациями, а также при помощи pyproject.toml. К удивлению, тут не будет рассказа про poetry, однако его описание не заставит долго ждать в пятом разделе. Довольно интересно было узнать про существование инструмента для генерации так называемого лока зависимостей при помощи инструмента pip-tools.

В пятом разделе идет речь про всем знакомый poetry, который предоставляет автоматизированный инструмент для решения рутинных задач: менеджмента зависимостей, создания пакета и публикации его в индексе пакетов и пр. Описаны различия в pyproject.toml с тем, что было описано в предыдущих главах, когда мы познакомились с его синтаксисом. В экосистеме Python, кроме poetry, есть альтернативы в качестве hatch и maturin.

В шестом разделе описан краткий кмб (курс молодого бойца) по тестированию с элементами рефакторинга для разработчиков на Python, где упоминаются два тестовых фреймворка:  unittest и pytest. В целом, это базовые основы, но для погружения приводятся и другие источники с более детальным описанием данной темы. Единственное, не упоминается про nose, но на практике в последние годы лидером является де-факто pytest. В случае каких-нибудь ограничений по зависимостям выбор будет очевидным: unittest. Из занимательного был приведен пример мини-рефакторинга кода по созданию более гибкой основы для поддержки кода в будущем и упрощения тестирования.

В седьмом разделе поднимается вопрос покрытия кода тестами при помощи стандартного модуля trace, а также стороннего модуля coverage. Но все же рекомендуется к использованию именно сторонний модуль, который можно запускать на разных версиях интерпретатора Python и впоследствии получить комбинированный отчет о покрытии кода тестами, следуя правилу coverage run-> coverage combine-> coverage report. В конце концов, все когда-нибудь сталкиваются с дилеммой на проекте: «Чтобы протестировать, вам нужно провести рефакторинг кода; но рефакторинг без тестов слишком рискован». Тут, скорее всего, всё будет зависеть от самого проекта, его масштабов, качества самого кода и наличия тестов как таковых.  Как мне кажется, нужно идти прагматичным путем, и не следует добиваться всегда эталонных 100%, зачастую это и не требуется. Вероятнее всего, на момент ознакомления еще не была готова глава с автоматизацией всей этой истории при помощи инструмента Nox.

Перед тем как подвести итоги, давайте установим pipx и попробуем использовать его в качестве «песочницы».

PIPX в действии

На официальном сайте разработчики инструмента позиционируют его так:

“Overview: What is pipx?

pipx is a tool to help you install and run end-user applications written in Python. It's roughly similar to macOS's brew, JavaScript's npx, and Linux's apt.

It's closely related to pip. In fact, it uses pip, but is focused on installing and managing Python packages that can be run from the command line directly as applications.”

«Обзор: Что такое pipx?

pipx — это инструмент, который поможет вам устанавливать и запускать приложения для конечных пользователей, написанные на Python. Он примерно похож на Brew в macOS, npx в JavaScript и apt в Linux.

Он тесно связан с pip. Фактически он использует pip, но ориентирован на установку и управление пакетами Python, которые можно запускать из командной строки непосредственно как приложения».

Прекрасная новость, если в комплекте с пакетом будет еще и cli интерфейс, поскольку можно будет запустить необходимый пакет сразу напрямую, при помощи одной команды, без предварительной установки. Привет инструменту npx из мира NodeJS ;)

После установки pipx локально, запустим 5 небольших проектов, чтобы убедиться, насколько это быстро и просто.

  1. Утилита для генерации аудио-файлов из текста google-speech

В консоли запустим следующую команду:

$ pipx run google-speech -l en -o hello_world.mp3 "Hello, world!"

В директории, где была запущена команда, в данном случае будет сгенерирован файл hello_world.mp3, который можно прослушать при помощи медиаплеера.

  1. Утилита для подсчета контрольных сумм файлов и директорий chksum-cli

В консоли запустим следующую команду:

$ pipx run chksum-cli ./hello_world.mp3 b754e299a96327caaddd44b453f66ed9439c5d64d0d6e55c7e32471115757e5e sha256

Будет выведен результат совпадают контрольные суммы файлов или нет.

  1. Утилита для отправки запросов по HTTP протоколу httpy-cli

В консоли запустим следующую команду:

$ pipx run httpy-cli mail.ru

Будет выведен HTTP ответ с заголовками и телом запроса.

  1. Утилита для отображения псевдографических часов в консоли с возможностью установки таймера timy-cli

В консоли запустим следующую команду:

$ pipx run timy-cli -с

Будет выведены аналоговые часы, с возможностью остановить их используя комбинацию клавиш CTRL + C.

  1. Консольная игра в шахматы с возможностью сетевой игры cli-chess

В консоли запустим следующую команду:

$ pipx run cli-chess

Запустится меню для выбора типа игры: 

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

Ну что же, пришло время подвести итоги.

Впечатления о книге

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

Что понравилось:

  • Лично для себя открыл инструмент pipx (аналог npx из мира Node.js), который очень удобен в случаях, когда нужно с чем-то быстро ознакомиться и глянуть. Своего рода песочница, особенно хорош для проектов, где есть cli-интерфейс для запуска;

  • Было интересно узнать о существовании таких альтернатив poetry (https://python-poetry.org/), как hatch (https://hatch.pypa.io/latest/) и maturin (https://www.maturin.rs/);

  • Пример использования бэкпорта для разных версий интерпритатора Python, к примеру, importlib_metadata используется в качестве бэкпорта для Python3.7, в отличие от importlib.metadata для Python3.8. Пример кода из книги:

try:                                        

from importlib.metadata import metadata

except ImportError:                        

	from importlib_metadata import metadata

Чего, по моему мнению, не хватает в книге:

  • Не рассмотрен вариант с пакетным менеджером для установки Python в ОС семейства Windows, к пример chocolatey (https://chocolatey.org/);

  • Не рассмотрен способ самостоятельной сборки Python из исходников для Unix дистрибутивов;

  • Не рассмотрен способ запуска Python в docker контейнере. На сегодняшний день есть много сборок, начиная от самого минималистичнго на базе alpine;

  • Не рассмотрен способ приведения проекта к запуску исполняемого файла .exe в ОС семейства Windows (в моей практике был такой кейс. Да, согласен, что очень нишевая задача, но все же);

  • Не рассмотрен альтернативный пример распространения проекта, например, используя стандартный пакетный менеджер apt для debian-подобных дистрибутивов при помощи инструмента setuptools и dh-virtualenv с формированием пакета *.deb);

  • Нет главы с описанием линтеров, например таких как pylint, flake8, isort, black, mypy, pyright и пр.

Несмотря на то, что книга еще не вышла в финальной версии (релиз планируется в апреле 2024 г.), могу рекомендовать к ознакомлению всем, кто интересуется Python.

Источник: https://habr.com/ru/companies/usetech/articles/759258/


Интересные статьи

Интересные статьи

Может ли студент второго курса написать JIT - компилятор Питона, конкурирующий по производительности с промышленным решением? С учётом того, что он это сделает за две недели за зачёт по программирован...
Всем привет! В рамках нашего блога мы планируем делиться не только историями и опытом, но также освещать последние нововведения и изменения, связанные с платформой Rightech IoT Cloud (...
Новая версия ожидается только в октябре, но уже можно почитать, что нас ждет в ней и потестить предварительный релиз. В этой статье самые интересные, на мой взгляд, изменения. Во-...
Сегодня мы хотим рассказать еще об одном комбо-устройстве, которое сочетает в себе высокоэффективный радар-детектор, видеорегистратор FullHD и GPS-информатор. В этот раз речь пойдет о Playme P570...
Обычно pytest используется не самостоятельно, а в среде тестирования с другими инструментами. В этой главе рассматриваются другие инструменты, которые часто используются в сочетании с pytest для эффек...