2022年6月5日日曜日

vscodeでpythonの型ヒントを使ってみた


背景

pythonの型ヒントのことを時々目にすることがあり気になっていたので使ってみました。
設定方法や試したことを共有します。

記事最後の参考でも紹介しますが、これらのページが参考になりました。
Python 型ヒント 入門
typing --- 型ヒントのサポート

使ったもの

vscode
マイクロソフトが公開しているエディタです。
mypyをpipでインストールしてコマンド実行でも解析できますが、VSCodeの方が見やすいと思うので、この記事ではVSCodeを使います。

VSCodeでのpythonの型ヒント有効化

プラグインをインストール

拡張として「ms-python.python」をインストールします。
拡張一覧ボタンを押して一覧を出し、「ms-python.python」と入力し、installボタンを押します。
(自分の環境ではpython利用時の推奨プラグインに含まれていたのか、既にインストールされていました。)


mypyを利用した静的解析を有効化

拡張機能からmypyをインストール

静的解析ツールはVSCodeの拡張機能としてインストールする方式なので、拡張機能からmypyをインストールします。


記事執筆当時のmypy設定方法

2025年1月時点ではlintツールの設定方法がVSCodeの拡張機能からインストールする方式に変わっていました。
下記の方法は2025年時点では使えませんが、昔の操作方法が何かの参考になるかもしれないので残します。

「Ctrl + Shift + p」を入力して操作入力モードにし「select linter」と入力します。
候補がいくつか出てくるので「Python: select linter」を選びます。


参考にした記事に合わせてmypyを選択します。


mypyがインストールされてなければインストールの承認画面が出てくるので同意してください。
今回はpython3.9でmypy-0.960がインストールされました。


静的解析有効化のために、インストールしたらvscodeを再起動するか、Ctrl + Shift + pを入力して「reload window」を入力して選択して画面を読み直してください。


必要があればmypy自体もインストール

検証機が少ないのでまだ確証が無いのですが、mypyプラグインはVSCodeでmypyを呼べるものらしく、mypy自体は別途インストールが必要そうです。

ubuntuやraspberry pi OSなどdebian系なら下記のコマンドでインストールできます。
sudo apt install mypy

システムコマンドで無くても良いなら、pip経由でのインストールも可能です。
pip install mypy

mypyの設定ファイル作成

mypyの標準設定だと型定義が無いライブラリのimportでエラーが発生します。


Skipping analyzing "name_of_the_library": module is installed, but missing library stubs or py.typed markermypyimport
See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-importsmypynote

型対応が不十分なライブラリを使うことは多々あるので、自分は下記の設定で警告を無効にしています。
ホームフォルダに.mypy.iniを作って下記の設定を記述すると型定義が無いライブラリのimportのエラーが消えます。
~/.mypy.ini
[mypy]
ignore_missing_imports = True

mypyの設定ファイル置き場は複数の選択肢があるので、公式の説明書きで紹介されている他の場所に置いても良いです。
The mypy configuration file

不整合のある型の使い方をしてみる: 赤線で指摘される

あえて間違えてどのような挙動をするか見てみます。
引数に整数(int)を要求する関数を作り、自然数(float)を渡してみます。
def mul(a: int, b: int) -> int:
return a * b

print(mul(3.5, 0.4))

自然数を渡した部分に赤線が表示されました。


マウスカーソルを赤線に重ねると、エラーの理由が表示されます。


「Ctrl + Shift + P」でメニューを開き「toggle problems」と入力して選択すると、問題箇所の一覧が見れます。



整合性のとれた書き方をしてみます。
def mul(a: float, b: float) -> float:
return a * b

print(mul(3.5, 0.4))

赤線は無くなり、問題一覧も問題なしとなりました。


型のある関数と型のない関数を組み合わせて使ってみる: 実行時エラーになるけど解析は問題なしとなる

型は付けていませんが文字列を返す関数の戻り値を、先ほど定義した引数にfloatを求める関数の引数として渡してみます。
def get_str():
return "hi"

def mul(a: float, b: float) -> float:
return a * b

print(mul(get_str(), 2.1))

静的解析は問題なしとなりました。


しかしながら、実行するとエラーになります。


型を割り当ててないとAny型として扱われるようで、問題があるコードでも問題箇所を見つけられませんでした。

get_strで文字列が返されると型を書けば指摘されました。
def get_str() -> str:
return "hi"

def mul(a: float, b: float) -> float:
return a * b

print(mul(get_str(), 2.1))


おわり

vscodeでpythonの型ヒントを解析して不整合な箇所が指摘されるようにしました。
型を適用していないものと組み合わせると不整合を検出できない場合がありますが、関数の中など型を全ての変数に適用した処理では安心を得られて嬉しいです。

参考

型ヒントの設定方法や書き方の例が紹介されています。
Python 型ヒント 入門

python本家の型説明です。
typing --- 型ヒントのサポート

vscodeのpythonの静的解析設定説明です。
Linting Python in Visual Studio Code

mypyの設定ファイルの説明ページです。
The mypy configuration file

変更履歴

2025.01.12
mypyをVSCodeの拡張機能からインストールする手順を追加しました。
2024.01.19
VSCodeプラグインではないmypyのインストール手順を追加しました。
mypyの型定義が無いライブラリimport時のエラーを無効化する設定ファイルの書き方を追加しました。

0 件のコメント :