nikkie-ftnextの日記

イベントレポートや読書メモを発信

VS Code で Python を書く際、関数の呼び出し方に問題があったら Pylance に指摘させる

はじめに

七尾百合子さん、お誕生日 202日目 おめでとうございます!1 nikkieです。

Know your editor2(汝のエディタを知れ)とはよく言ったもので、VS CodePython を書くときの Today I learned です。

目次

前提:Pylance

私は VS CodePython を書いています。
Microsoft による「Python 拡張」をインストールして使っています3

この拡張は Pylance をインストールします。

Pylance – performant Python language support (Installed extensions より)

Pylance は Microsoft による Pyright を使っています
(Pylance が Language Server にあたるんですかね? 宿題事項)

Using Pyright, Pylance has the ability to supercharge your Python IntelliSense experience with rich type information, helping you write better code faster.

PyCon JP 2025 で型チェッカの歴史を語る発表のスライドより

問題のある関数の呼び出し方を Pylance に指摘させたい

私はこれまで実行時エラーにしてきたのですが、Pylance (静的解析)で指摘させられるのかを調べました4

.vscode/settings.jsonpython.analysis.typeCheckingMode という設定項目があります。
https://github.com/microsoft/pylance-release?tab=readme-ov-file#settings-and-customization

設定値は4段階で off / basic / standard / strict です。
デフォルトでoffになっています。

Pyright のドキュメントには、それぞれの設定値がどのルールを指摘するかの一覧があります。
https://microsoft.github.io/pyright/#/configuration?id=diagnostic-settings-defaults

問題のある関数の呼び出し方の指摘は、basic に上げるだけで有効になりました。

Diagnostic Rule Off Basic Standard Strict
reportCallIssue "none" "error" "error" "error"

https://github.com/microsoft/pylance-release/blob/main/docs/diagnostics/reportCallIssue.md

This includes incorrect argument types, missing or extra arguments, and issues with callable objects.

この Pyright の設定を、.vscode/settings.json ではなく、pyproject.toml に書くことにしました。

[tool.pyright]
typeCheckingMode = "basic"

python.analysis.typeCheckingMode のドキュメントを読み、以下を見つけました。

Note that the value of this setting can be overridden by having a pyrightconfig.json or a pyproject.toml.

Python プロジェクトにおける pyright の設定だから pyproject.toml に書いてみるか」くらいの軽い気持ちで書いています。

microsoft.github.io

これだけで Pylance が問題のある関数の呼び出し方を指摘するようになり、感動しました。

なお、python.analysis.typeCheckingMode のドキュメントには、パフォーマンスの考慮が記載されています。

Setting python.analysis.typeCheckingMode to off can improve performance by disabling type checking analysis, which can be resource-intensive, especially in large codebases.

この考慮のためにデフォルトがoffなんでしょうかね

実際に指摘できることの確認:google-adk のバージョンアップ

google-adk は 1.2.1 -> 1.3.0 で get_fast_api_app の引数が変わっています。
session_db_url -> session_service_uri
これに静的解析で気づくことを今回のゴールにします。

作業ディレクトリにて

% uv init --no-readme
% uv add 'google-adk<1.3'

uv が作った.venv下の Python 処理系を「Select Interpreter」。
pyproject.tomlには上記の設定を書きます。

main.pyを書いていくと

from google.adk.cli.fast_api import get_fast_api_app


def main():
    app = get_fast_api_app(
    )

パラメーター "agents_dir", "web" に引数がありません

静的解析で指摘されました!

以下のようにすると指摘は消えます5

def main():
    app = get_fast_api_app(
        agents_dir="./my_agent",
        web=False,
        session_db_url="sqlite:///./test.db",
    )

それでは google-adk のバージョンアップです。
pyproject.tomlから上限を撤廃します。

[project]
dependencies = [
-    "google-adk<1.3",
+    "google-adk",
]

これでuv sync -P google-adkで最新化されます(1.15.1まで上がりました)。
main.pyを開くと

"session_db_url" という名前のパラメーターがありません

google-adk の引数変更が静的解析で指摘されました!🙌

終わりに

pyproject.tomlに Pyright の設定を書いて Pylance も設定し、関数の呼び出し方の問題を指摘させることができました。
関数の呼び出し方の問題(reportCallIssue)は basic で十分でした。

より厳しく指摘させたい場合は、Pyright のドキュメント「Diagnostic Settings Defaults」の表や、Pylance のリポジトリのルール一覧を参照しながら設定することになりそうです。

今まで使っていなかったのを後悔するほど、めちゃめちゃ有用そうです。
ただ、パフォーマンスとトレードオフという点は念頭に置きたいと思います。

宿題事項

  • mypy の VS Code 拡張も同様に設定できるのかな?

  • 人間にとってなかなかよさそうですが、生成AI(コーディングエージェント)にはどう見せればいいんだろう?
    • serena とかは、コーディングエージェントに Language Server を見せている??

  1. 田中琴葉さん、お誕生日誠におめでとうございます!
  2. 『The Art of Agile Development, 2nd Edition』より
  3. ref: https://code.visualstudio.com/docs/python/python-tutorial#_prerequisites
  4. 同僚からの質問駆動です
  5. 今回は動かさないのでagents_dirはダミーなのですが、uv run adk createで作成もできます