0xf

日記だよ

pylanceで strictモードを有効にしているとき、boto3-stubs を使っていても boto3.client が「部分的に不明です」と言われる

こうなるやつ

原因

  • boto3-stubsはそのままインストールしただけでは、個別のサービスについてのスタブがインストールされない。 python -m pip install "boto3-stubs[s3]" みたいにサービスごとにインストールしないといけない。
  • boto3.client() は渡された文字列に応じてクライアントを作って返すファクトリーなので、戻り値の型は ServiceA_Client | ServiceB_Client | ServiceC_Client ... とサービスごとに分かれている。
  • つまり、client() の戻り値の全体像は、boto3-stubs の全てのサービスをインストールしないと解釈できない。不明な型1 | 不明な型2 | 不明な型3 | ... | 既知の型となり、「部分的に不明です」となる。
    • 絶妙に推論の挙動が気持ち悪いけど、オーバーロードされているメソッドのどれかが選ばれて(戻り値はちゃんと SecurityHubClient として推論されているので)であっても、オーバーロードされている他のシグネチャに不明な型が含まれていたら引っかかってしまう。

対策

  • 全てのサービスをインストールする
  • 該当コードについては # pyright: ignore[reportUnknownMemberType] 指定してしまう。
    • 現実的。
    • 行末コメントを許可しないといけない。
  • python.analysis.typeCheckingMode = "strict" をやめる
    • ウム...