Языки программирования

4 ключа к написанию современного Python

4 ключа к написанию современного Python

Хотя в 2021 году Python исполнилось 30 лет, взрывное распространение, рост и перспективные разработки, связанные с этим языком, все еще относительно новы. Многие возможности Python остаются неизменными с момента его создания, но с каждым годом и с каждым новым изданием Python появляются новые способы выполнения задач и новые библиотеки, использующие эти достижения.

Таким образом, в Python есть старые и новые способы. Естественно, имеет смысл научиться работать с Python, используя его самые современные и удобные возможности. Здесь мы рассмотрим ключевые концепции, которые вам необходимо понять, чтобы писать на современном Python в 2024 году - программное обеспечение, использующее новейшие и самые лучшие идиомы, концепции и возможности Python.

Подсказка типов в Python

Недавно появившийся в Python синтаксис подсказки типов позволяет линерам и сторонним инструментам качества кода анализировать ваш код до начала выполнения и выявлять возможные ошибки до того, как они проявятся. Чем больше вы создаете кода на Python, чтобы поделиться им с другими, тем больше вероятность того, что вы (и все остальные!) выиграете от использования подсказок типов.

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

Важно помнить, что подсказки типов являются опциональными, а не обязательными. Не каждый проект нуждается в них. Используйте подсказки типов, чтобы сделать понятными большие проекты, но не стесняйтесь опускать их в 50-строчном сценарии. И хотя подсказки типов не применяются во время выполнения, вы можете использовать Pydantic, чтобы сделать это возможным. Многие широко используемые проекты на Python широко применяют Pydantic - FastAPI является одним из примеров.

Виртуальные среды Python и управление пакетами

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

  • Pyenv: Если вам нужно держать несколько версий Python установленными для удовлетворения различных требований проекта, Pyenv позволит вам переключаться между ними глобально или для каждого проекта. Это полезно, если вы часто работаете с разными версиями Python прямо в командной строке, вне контекста виртуального окружения для каждого проекта. Обратите внимание, что официальной поддержки Windows нет, но существует неофициальный порт для Windows.
  • Pipenv: Названный "Python dev workflow for humans", Pipenv предназначен для управления виртуальным окружением и всеми зависимостями для вашего проекта. Он также обеспечивает детерминированность зависимостей, то есть вы получаете конкретные версии, которые вам нужны, и что они работают в той комбинации, которую вы запрашиваете. Однако Pipenv не поддерживает упаковку в любой форме, поэтому он не идеален для проектов, которые вы хотите выложить на PyPI или поделиться с другими.
  • Поэзия: Расширяя набор инструментов Pipenv, Poetry не только управляет проектами и требованиями, но и упрощает развертывание проекта на PyPI. Он также управляет виртуальными окружениями отдельно от каталогов проектов.
  • PDM: PDM (сокращение от Python Development Master) - недавний передовой проект в этом направлении. Как и Poetry и Pipenv, PDM предоставляет единый интерфейс для создания проекта, управления его зависимостями и сборки из него артефактов дистрибутива. PDM также использует стандарт PEP 582 для хранения пакетов локально в проекте, поэтому нет необходимости создавать виртуальные среды для каждого проекта. Однако этот инструмент относительно новый, поэтому прежде чем использовать его в производстве, убедитесь, что он работает временно.
  • Hatch: Проект hatch не только занимается настройкой и управлением проектами, но и предоставляет систему сборки, инструменты для упаковки проектов для распространения на PyPI, обработку тестов и множество других полезных функций.
  • uv: Экспериментальный проект uv написан теми же людьми, которые делают инструмент для линтинга ruff Python. Его цель - заменить pip, venv и несколько других инструментов командной строки Python. Он написан на Rust для скорости (как и ruff), и многие его команды похожи на команды pip и других инструментов, которые он заменяет, что делает его относительно простым в освоении.

При создании новых проектов, над которыми предполагается работать в команде или распространять среди других (например, через PyPI), обязательно используйте современный формат pyproject.toml для требований и конфигурации проекта, а также используемый с ним макет проекта. Вы все еще можете использовать старый файл requirements.txt параллельно с pyproject.toml, но последний охватывает более широкий спектр случаев использования и делает ваши проекты совместимыми с будущим.

Новый синтаксис Python

Развитие Python привело к появлению множества новых дополнений к самому языку. В последних версиях Python были добавлены полезные синтаксические конструкции, которые позволяют создавать более мощные и лаконичные программы. Хотя они не являются обязательными, новые модули сторонних разработчиков могут их использовать, поэтому с ними стоит познакомиться хотя бы в общих чертах.

Особенно примечательны три недавних дополнения к синтаксису.

Согласование шаблонов

Самое большое недавнее дополнение, структурное сопоставление шаблонов, появившееся в Python 3.10, - это не просто "switch/case для Python", как его иногда описывают. Структурное сопоставление шаблонов позволяет вам принимать решения о потоке управления на основе содержимого или структуры объектов. Короче говоря, это способ сопоставления на основе типов или форм типов (например, список с int и строкой), а не значений.

Оператор "морж"

Названный так из-за своего внешнего вида (:=), оператор "морж", добавленный в Python 3.8, представляет выражения присваивания - способ присвоить переменной значение, а затем применить к ней тест за один шаг. Это позволяет сократить объем кода во многих распространенных ситуациях, например, при проверке возвращаемого значения функции с сохранением результатов.

Параметры только для позиции

Незначительное, но полезное дополнение к синтаксису Python - "только позиционные параметры" - позволяет указать, какие параметры функции должны быть указаны как позиционные, а не как аргументы ключевого слова. Эта возможность в целом призвана улучшить ясность и облегчить дальнейшее развитие кодовой базы - цели, на которые направлены и многие другие новые возможности Python.

Тестирование в Python

Написание тестов для кодовой базы - это как ежедневная чистка зубов зубной нитью: Все согласны, что это хорошо, но мало кто из нас делает это на самом деле, и еще меньше делают это правильно. Современные кодовые базы Python заслуживают того, чтобы иметь тестовые наборы, а современные инструменты для тестирования делают создание тестовых наборов проще, чем когда-либо.

В Python есть свой собственный встроенный фреймворк тестирования, unittest. По умолчанию он неплох, но его дизайн и поведение устарели. Фреймворк Pytest стал популярной заменой. Он более гибкий (вы можете объявлять тесты в любой части кода, а не только в его подмножестве) и требует написания гораздо меньшего количества шаблонов. Кроме того, Pytest имеет множество дополнений, расширяющих его функциональность (например, для тестирования асинхронного кода).

Еще одним важным дополнением к тестированию является покрытие кода, определяющее, какую часть кодовой базы на самом деле покрывают тесты. Для этого в Pytest есть модуль Coverage (как следует из названия) и даже плагин для работы с ним.

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