はじめに
AWSを利用した開発をするにあたり、Boto3を使い始めました。
基本的には便利なのですが、type hintを使えず、IDEのコード補完も効かないので、
開発中は公式ドキュメントとIDEを何往復もし、何渡すんだっけ、何返ってくるんだっけしながらコピペするみたいなことをしていてとてもめんどくさいです。
そんなめんどくささから解放され、開発のスピードも上げていきたいということで見つけたのがboto3-stubsです。
今回はそれを試してみようというのが本記事の目的です。
やっていく
基本的にはPyCharm Community Editionでやっていきますが、
最後にVSCodeでもやります。
1. Project作成
2. パッケージのインストール
以下のコマンドを利用してboto3とboto3-stubsをインストールします。
pipenv install boto3
pipenv install 'boto3-stubs[sqs]'
今回はさっくりと試したいのでSQSのみをインストールしていますが、
複数のサービスを利用したい場合にはboto3-stubs[sqs, dynamodb]
のようにカンマ区切りでインストールすることができます。(大文字でもいけました)
試す
stubsを使わないパターン
import boto3
def test() -> str:
sqs = boto3.client("sqs")
よくあるクライアントを作成する時のコードです。
このままこのクライアントを使ってメッセージを受信する処理を作ろうと思ってもコード補完は効きません。
boto3.client("service_name")
はメソッドの定義上Anyを返すので、返ってきたインスタンスで何ができるのかIDEでは予測しようがないためです。
stubsを利用してみる
クライアントを作るところはstubsを使わないパターンと一緒ですが、type hintの指定が異なります。
import boto3
from mypy_boto3_sqs.client import SQSClient
def test() -> str:
sqs_stubs: SQSClient = boto3.client("sqs")
SQSClient
をtype hintに指定することでコード補完が可能になります。
これなら、ある程度用語などわかっていれば公式ドキュメントを見なくてもSQSの操作ができそうです。
さらに以下のようにレスポンスにもtype hintを適用することができます。
def test() -> str:
sqs_stubs: SQSClient = boto3.client("sqs")
result: ReceiveMessageResultTypeDef = sqs_stubs.receive_message(QueueUrl="url")
messages: List[MessageTypeDef] = result.get(key="Messages")
message: MessageTypeDef = messages[0]
body: str = message.get(key="Body")
return body
定義されているkeyについては定義を見に行くことになりますが、
IDE内で完結しているため手間はかなり減りました。
おまけ: VSCodeでもやってみる
VSCodeには便利な拡張機能があり、PyCharmよりもより便利にboto3-stubsを利用することができます。
利用するのはAWS boto3です。
拡張機能のインストール後、Command PaletteからAWS boto3: Auto-discover boto3 services in current project
を実行します。
すでにコードがある場合にはよしなにコード内を探して利用されているサービスにチェックを入れてくれます。
調整してOKをすると、インストールが走ります。
そうするとこんな感じでtype hintなしでもコード補完が効くようになります。
type hintは書きたくないけどコード補完は欲しい場合にはこちらが有効そうです。
スクショ等は載せませんが、クライアント作成時点時に、SQSClientが返却されるようマウスオーバー表示があるのでその辺りも便利な拡張機能です。
まとめ
使ってみた感じですが、type hint + コード補完によってかなり開発の速度が上がりそうな気がしています。
PyCharmとVSCodeで試し、拡張機能がある分VSCodeのほうが少し便利に使えますが、
PyCharmの方がレスポンスのキー確認などがしやすかったりします。
完全にお好みで問題ない範囲だと思います。
お疲れ様でした
参考
Boto3の補完を可能にするboto3-stubsを使ってみる
boto3-stubs を使って、boto3 でコード補完を有効にしよう