Python で AWS 系のプログラムを組んでると、必ずといっていいほど、boto3 という AWS SDK のお世話になるはずです。
この boto3、AWS のサービスをすべて叩けるたくさんの機能持ちなのに、型がないためコード補完が聞きません。boto3.client("s3")
などと、サービス名を文字列で受け取るので、型定義としては BaseClient
型になっていて、各サービス用のクライアントの型になってないんですね。普段、補完がガンガン聞く環境で開発しているので、これがなかなかにつらい。
なんとかならないものかと思って探してみたところ boto3-stubs というパッケージを見つけました。このなかで、s3 や ec2 などの各サービス用のクライアント・リソースの型が定義されているので、この型をつけてあげると、、、
こんなかんじで補完をしてくれるようになります! これはいい!!
インストール
pip install boto3-stubs[essential]
バージョンは boto3 と合わせてつくようになっているので、特定の boto3 を使っている場合も、同じバージョン番号を指定してあげれば、問題なく利用できます。パッケージは自動で更新されていて、boto3 が更新された日に boto3-stubs もリリースされているようです。
上記の [essential]
指定では、 "ec2, s3, rds, lambda, sqs, dynamo, cloudformation" のクラスが入ります。これだけで 7MB ぐらい必要ということで、いきなり全部入るようにはなってないようです。他に必要なのがあれば、 [essential,ecs]
といった形で適宜、指定してあげれば OK です。
使い方
import boto3
from mypy_boto3_s3 import S3Client, S3ServiceResource # from boto3-stubs
s3: S3Client = boto3.client("s3")
s3_r: S3ServiceResource = boto3.resource("s3")
これで、s3
, s3_r
変数にコード補完が聞くようになります。型を指定してあげるので、VSCode など型に基づく補完がきくエディタなら、なんでも同じやり方で OK です。
余談
- boto3-stubs を mypy で使うと、型指定を手で書かなくても型チェックできる仕組みがあるようです。
- boto3 プロジェクトでも、stub を用意する動きはあるっぽいです。将来的には、このあたりも動きがある、かもしれません。