2022年6月5日日曜日

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


背景

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

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

使ったもの

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

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

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

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


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

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


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


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


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


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

あえて間違えてどのような挙動をするか見てみます。
引数に整数(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

0 件のコメント :