Создание современной среды разработки на Python

Будучи разработчиком на Python в течение последних нескольких лет, я собрал список своих любимых пакетов/инструментов, которые я использую почти в каждом проекте. Разработка — это командная работа, и в какой-то момент кому-то придется читать и/или изменять написанный вами код. Если код плохо реализован, а разработчику нужно реализовать новую функцию или исправить ошибку, это, скорее всего, приведет к возникновению дополнительного технического долга. Поэтому мне нравится заставлять разработчиков (*включая меня самого*😉) создавать код, который тестируется, поддерживается, читается и, самое главное, является последовательным, иначе он будет отклонен. В результате процесс разработки программного обеспечения проходит более гладко, поскольку они будут работать над одним и тем же надежным кодом.

В этой статье блога показано, как я устанавливаю и настраиваю свою среду разработки Python, используя pyenv и Poetry, как на Unix, так и на Windows системах для создания одинакового согласованного кода, что помогает предотвратить технический долг.

Установка pyenv 🐍

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

Установка для Windows

Пользователям Windows я рекомендую установить WSL2, подсистему Windows, которая позволяет разработчикам работать в среде Linux без накладных расходов на традиционную виртуальную машину или установку двойной загрузки. Вы можете установить WSL2, выполнив следующую команду в PowerShell или Command Prompt:

Если вы не хотите использовать WSL2, вы можете установить pyenv-win, менее современный подход * и перейти к разделу **Установка версии Python с помощью pyenv*.

После установки найдите Ubuntu on Windows (WSL терминал) и откройте его. Перед вами откроется оболочка bash и попросит ввести имя пользователя и пароль. Как только они будут заданы, ваш терминал готов к работе 🔨 !

Перед установкой pyenv вам нужно будет обновить окружение и установить несколько зависимостей сборки *(если у вас их еще нет). *Откройте терминал и выполните следующие команды:

> sudo apt update && sudo apt upgrade
> sudo apt install -y build-essential git curl libexpat1-dev libssl-dev zlib1g-dev libncurses5-dev libbz2-dev liblzma-dev libsqlite3-dev libffi-dev tcl-dev linux-headers-generic libgdbm-dev libreadline-dev tk tk-dev
Войти в полноэкранный режим Выйти из полноэкранного режима

pyenv теперь готов к установке и настройке (укажите терминалу, где находится pyenv):

> curl https://pyenv.run | bash

> echo 'nexport PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
> echo 'neval "$(pyenv init -)"' >> ~/.bashrc
> echo 'neval "$(pyenv init --path)"' >> ~/.bashrc

> source ~/.bashrc

# Confirm successful installation:
> pyenv --version
pyenv 2.2.5 # Your version will likely be newer.
Войдите в полноэкранный режим Выйти из полноэкранного режима

Установка версии Python с помощью pyenv

После успешной установки pyenv установите глобальную версию Python с помощью следующих команд:

# Install the required Python version:
> pyenv install 3.9.0

# Refresh pyenv since you installed a new Python version:
> pyenv rehash

# Set your global Python version:
> pyenv global 3.9.0

# You can also set the local Python version, i.e. for a project:
# > pyenv local 3.9.0

# Confirm Python version:
> pyenv version
3.9.0 (set by /home/wsl/.pyenv/version)
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вам нужна другая версия Python, вы можете просто выполнить те же команды с другим номером версии 🤗.

Установка Python 📜

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

> pyenv shell 3.9.0

> curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

> source ~/.bashrc

# Confirm installation was successful:
> poetry --version
Poetry version 1.1.13 # Your version will likely be newer.
Вход в полноэкранный режим Выход из полноэкранного режима

EditorConfig

EditorConfig помогает поддерживать согласованные стили кодирования для нескольких разработчиков, работающих над одним проектом в различных редакторах и интегрированных средах разработки (IDE). Он работает путем чтения конфигурационного файла .editorconfig, предоставляемого на верхнем уровне проекта. Большинство IDE имеют встроенную поддержку, но это список IDE/редакторов, для которых требуется плагин.

Это стандартный файл .editorconfig, который я использую во всех своих проектах Python:

Теперь ваша среда готова к созданию современного проекта Python 🥳.

Создание и настройка проекта Python ⚙️

Ниже описано, как *ручно *создать и настроить проект Python с помощью pyenv и Poetry.

Чтобы создать новый проект Python, необходимо указать версию Python с помощью pyenv, а затем использовать Poetry для создания проекта.

> pyenv shell 3.9.11
> poetry new PROJECT_NAME # Example testproject
> cd testproject
> git init # Initialise the repository
Вход в полноэкранный режим Выход из полноэкранного режима

Далее создайте конфигурацию .editorconfig, указанную выше. Структура дерева вашего проекта должна выглядеть следующим образом:

> tree

.
├── .editorconfig
├── .git
│   ├── ...
├── README.rst
├── pyproject.toml
├── testproject
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_testproject.py

12 directories, 22 files
Вход в полноэкранный режим Выйти из полноэкранного режима

Лично я предпочитаю Markdown вместо reStructuredText, поэтому я переименовал README.rst в README.md . Вся логика приложения помещается в папку с именем вашего проекта, а тесты — в папку tests.

Мои основные пакеты Python 📦

В этом разделе описано большинство пакетов для разработки (пакеты, которые необходимы только на этапе разработки), которые я использую в проектах Python.

pytest с pytest-cov

Фреймворк pytest позволяет легко писать небольшие тесты, но при этом масштабируется для поддержки сложного функционального тестирования приложений и библиотек. Я предпочитаю pytest встроенной библиотеке unittest, поскольку она позволяет использовать такие плагины, как pytest-xdist, который позволяет выполнять несколько тестов одновременно, ускоряя время выполнения тестов и требуя меньше строк кода для получения того же результата, что и unittest. Кроме того, pytest-cov — это плагин, который автоматически создает отчет о покрытии тестов.

wemake-python-styleguide

Команда wemake.services описывает wemake-python-styleguide как *самый строгий и самый категоричный Python-линтер на свете*. По сути, это пакет flake8, инструмент линтинга, анализирующий код на наличие дефектов, с дополнениями. Его основными задачами являются:

  • Обеспечение использования Python 3.6+.

  • Значительно снизить сложность кода и сделать его более удобным для сопровождения.

  • Внедрение правила «Должен быть один — и желательно только один — очевидный способ сделать это» в стили кодирования и именования.

  • Защита разработчиков от возможных ошибок и внедрение лучших практик.

Я также рекомендую плагин flake8-pytest-style, если вы используете pytest.

Для существующих проектов вы можете использовать пакет flakehell с функцией baseline для сообщения о новых нарушениях, поскольку интеграция нового линкера, скорее всего, приведет к сотням или даже тысячам нарушений. Это руководство объясняет, как интегрировать flakehell и устранять нарушения с течением времени.

Mypy

Mypy — это опциональная статическая проверка типов, цель которой — объединить преимущества динамической (или «утиной») типизации и статической типизации. Преимуществами статически типизированного кода являются повышенная читабельность и удобство сопровождения. Для существующей кодовой базы здесь приведено руководство по внедрению Mypy.

Безопасность

В отчете по безопасности за 2021 год, подготовленном компанией Snyk, говорится, что 47% проектов на Python содержат известные уязвимости. С другой стороны, почти 87% известных уязвимостей могут быть устранены путем обновления уязвимого пакета. Safety проверяет установленные вами зависимости на наличие известных уязвимостей безопасности.

pre-commit

pre-commit — это фреймворк для управления и поддержки многоязычных крючков предварительной коммисии. Например, хук, запускающий pytest, должен успешно выполнить проверку перед фиксацией кода в репозитории, предотвращая дефекты кода. Следующий конфигурационный файл pre-commit — это то, что я использую в своих Python-проектах. Он гарантирует, что тесты, покрытие, проверка типов и сканирование на уязвимости пройдут до фиксации кода.

Это файл .pre-commit-config.yaml, используемый в приведенном выше примере:

Nitpick

Поддержание конфигураций в разных проектах может стать утомительным, особенно если учесть, что EditorConfig, pytest-cov, flake8, Mypy и pre-commit требуют конфигурационных файлов. Nitpick — это инструмент и плагин для flake8, который обеспечивает одинаковые конфигурации в нескольких языково-независимых проектах, автоматизируя эту утомительную настройку.

После установки добавьте следующую строку в файл pyproject.toml:

**[tool.nitpick]**
style = "https://raw.githubusercontent.com/wemake-services/wemake-python-styleguide/master/styles/nitpick-style-wemake.toml"
Войти в полноэкранный режим Выйти из полноэкранного режима

Для успешного прохождения проверки Nitpick вам потребуется создать файлы .gitignore и CHANGELOG.md.

Он автоматически создаст файл setup.cfg, который будет содержать все необходимые конфигурации.

Поздравляем, вы успешно создали современную среду разработки на Python 🎉. Если вы хотите пообщаться со мной, вы можете найти меня на Linkedin или Github. Спасибо, что читаете 😊!

Дополнительно: Интеграция VSCode WSL2

Если ваш редактор — VSCode, то вам повезло, потому что вы можете легко интегрировать подсистему Linux с помощью его удаленного плагина WSL. После установки откройте терминал WSL и выполните код . . Это автоматически откроет редактор VSCode в подсистеме Linux. Подробнее об этом вы можете прочитать здесь.

Дополнительно: Автоматизированная установка и настройка проекта

Если вы похожи на меня, то вам необходимо автоматизировать задачу, когда вы делаете ее более одного раза. Я автоматизировал создание и настройку современного Python-проекта с помощью cookiecutter. Сначала вам нужно будет настроить свое окружение. Также в nitpick используется мой собственный вариант конфигурации wemake-services, вы можете посмотреть репозиторий здесь.

> pyenv shell 3.9.11

---------------------------------------------
# Unix: Specify the name of the project.
> export PROJECT_NAME="MY_PROJECT_NAME"
=============================================
# Windows: Specifcy the name of the project.
> set PROJECT_NAME="MY_PROJECT_NAME"
---------------------------------------------

> python -m pip install cookiecutter &&
python -m cookiecutter --no-input gh:ShaneNolan/python-project-template 
project_name=$PROJECT_NAME &&
(cd $PROJECT_NAME && git init &&
poetry init --no-interaction --name $PROJECT_NAME &&
poetry add mypy pytest pytest-cov flake8-pytest-style wemake-python-styleguide safety pre-commit nitpick --dev &&
poetry run nitpick fix &&
poetry run pre-commit install) && python -m uninstall cookiecutter
Вход в полноэкранный режим Выход из полноэкранного режима

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *