Включение автозаполнения для boto3 в VSCode

Одним из менее приятных аспектов работы с AWS с помощью Python является тот факт, что большинство IDE не могут поддерживать автозаполнение или IntelliSense для AWS SDK for Python (boto3) из-за того, как реализован boto3. Сегодня я собираюсь показать вам, как легко включить автозаполнение для boto3 в VSCode.

Прежде чем мы перейдем к решению, давайте поговорим о том, почему родной Autocomplete не работает с boto3. Обычно функциональность Autocomplete основывается на выполнении статического анализа кода на существующем коде и установленных зависимостях. Это означает, что он анализирует код, не выполняя его. Вот в чем проблема. Если вы посмотрите на код Python, установленный при запуске pip install boto3, вам будет трудно найти все методы API, которые вы можете использовать.

Причина в том, что методы API и структуры данных поставляются только в виде документов JSON. Не все из них поставляются с boto3. Большинство из них вы можете найти в базовой библиотеке botocore. Каталог данных в пакете boto3 содержит только определения для API ресурсов. Вот пример из API DynamoDB в модуле botocore.

Эти документы разбираются только при использовании boto3 или botocore, т.е. импортируются и инстанцируются где-либо. Затем SDK конструирует методы и классы на основе определения JSON. С технической точки зрения это довольно здорово, потому что вы можете обновлять SDK, изменяя файлы определений. Но у него также есть несколько недостатков. Когда вы впервые инстанцируете клиентов или ресурсы, это снижает производительность, поскольку необходимо выполнить синтаксический анализ и создать структуры данных. Обычно это одноразовое ограничение, поскольку они кэшируются в памяти. Более существенным недостатком является то, что Autocomplete не может обнаружить эти структуры, поскольку они существуют только в работающей программе — это не то, с чем может помочь статический анализ кода.

Итак… что же мы будем делать с этим? К счастью, некоторые умные и целеустремленные люди создали решение, которое теперь легко использовать. Модуль boto3-stubs (Github) можно использовать для включения автозаполнения. Относительно новое расширение VSCode для boto3 делает использование библиотеки более простым, чем когда-либо. Давайте погрузимся в работу. Сначала создадим рабочий каталог с новой виртуальной средой.

mkdir boto3-autocomplete && cd boto3-autocomplete
python3 -m venv .venv
# Activate the newly created environment
source .venv/bin/activate
pip install boto3
# Create an empty python script
touch aws_script.py
# Open the directory using vscode
code .
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Теперь перед вами должен появиться VSCode, и мы начнем с добавления некоторого шаблонного кода в aws_script.py:

import boto3

def dynamodb_fun():
    table = boto3.resource("dynamodb").Table("demotable")

    response = table.get_item(
        Key={
            "PK": "abc",
            "SK": "def"
        },
    )

def main():
    dynamodb_fun()

if __name__ == "__main__":
    main()
Вход в полноэкранный режим Выход из полноэкранного режима

Далее, пришло время установить плагин boto3 VSCode Plugin, что можно сделать, перейдя сюда и нажав кнопку «Install». Это займет несколько секунд, и расширение будет установлено. Для завершения установки нам нужно открыть палитру команд (Cmd + Shift + P) и запустить меню Quickstart.

Появится меню, и в правом нижнем углу нам нужно будет нажать кнопку «Установить», которая выполнит все необходимые приготовления.

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

Вы увидите еще одно меню с индикатором выполнения, и вам придется немного подождать, пока инструмент сделает свое волшебство. В фоновом режиме он установит множество пакетов, по одному для каждой выбранной вами службы. Эти пакеты содержат «заглушки» для методов API. Это означает, что они устанавливают модули со всеми классами, которые есть в «классической» реализации, только без бизнес-логики. Вот пример — снова из DynamoDB.

Как вы можете видеть, методы пусты, но имеют правильные параметры и подсказки типов, чтобы помочь при статическом анализе кода. Это все, что нам нужно сделать. Теперь мы можем использовать функцию автозаполнения, как мы привыкли. Обычно он должен появляться автоматически; если это не работает — попробуйте нажать Ctrl + Space, и вы увидите что-то вроде этого. Здесь представлены типы данных и ссылка на документацию.

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

Давайте посмотрим, какие зависимости установило для нас расширение, запустив pip freeze > requirements.txt. Вот выдержка:

boto3==1.23.10
boto3-stubs==1.23.10
botocore==1.26.10
botocore-stubs==1.26.10
jmespath==1.0.0
mypy-boto3-accessanalyzer==1.23.0.post1
mypy-boto3-account==1.23.0.post1
mypy-boto3-acm==1.23.0.post1
...
Войти в полноэкранный режим Выход из полноэкранного режима

Мой файл requirements.txt теперь содержит более 300 строк, что кажется немного чрезмерным, в основном потому, что нам не нужны все эти mypy-пакеты в производстве. Если мы сосредоточимся только на автозаполнении, мы можем смело их опустить.

# Filter out mypy-boto3* and *stubs packages
pip freeze | grep -v "^mypy-boto3" | grep -v "^.*stubs" > req
uirements.txt
Вход в полноэкранный режим Выход из полноэкранного режима

Однако эти пакеты Mypy могут делать гораздо больше, мы также можем создавать с их помощью подсказки типов для наших структур данных, но это делает потенциальную комплектацию наших пакетов для использования в Lambda немного более сложной, и я пока не нашел хорошего решения для этого, поэтому мы пока опустим это. Возможно, об этом будет рассказано в другой раз.

Подведем итоги: Я показал вам, как можно включить автозаполнение для boto3 в VSCode, используя правильное расширение и пакеты. Я также объяснил, почему boto3 и botocore не поддаются статическому анализу кода из коробки, и какие шаги предпринимает библиотека stubs для смягчения этого недостатка во время разработки.

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

— Морис

Оцените статью
Procodings.ru
Добавить комментарий