![thumbnail_python_logo](http://images.ctfassets.net/pqdb6oaeyby3/5luhbG8fj2gb7gJZKGeJf5/71b2d2a5102b8b81fb7941ea5d5da081/thumbnail_python_logo.png?w=1200&h=630&q=50&fm=png)
型チェックツールをmypyからPylance(Pyright)に変更
Pythonの型チェックといえばmypyが定番ですね。 私も3.5で型アノテーションが実装されて以降ずっと使っていたのですが、最近Microsoft製のPylance(Pyright)に変更したのでその記録です。
Language ServerをPylanceに変更
環境はVSCode 1.58.2で拡張機能のPythonとPylanceは既にインストール済みです。
VSCodeでPythonの新機能を確認していて、from typing import Literal しようとしたら Literal が候補に表示されなかったのが発端です。
当初はvenv環境が更新されていないのかと思ってチェックしたのですが、pythonのバージョンは3.9.6ですし、pip list -o でチェックしても、pip のライブラリは最新になっているのに何で?
これはLanguage Serverを"Microsoft"から"Pylance"に変更することで解決しました。 具体的には、VSCodeのsetting.jsonで既にあった設定を書き換えるだけです。
//修正 "python.languageServer": "Microsoft",
"python.languageServer": "Pylance",
これ、そもそもMicrosoft"と手動で設定した記憶がないんですよねWoozy Face Emoji VSCodeの更新時に自動で設定されたのかな?
Note: If you have never changed your language server setting, your language server is set to Pylance via the “Default” setting value.
// Google翻訳 // 注:言語サーバーの設定を変更したことがない場合、言語サーバーは「デフォルト」設定値を介してPylanceに設定されます。 https://code.visualstudio.com/docs/python/settings-reference#_code-analysis-settings
リファレンスを見たら今まで設定したことがない場合は、"Default"の設定でPylanceを使うようです。 ということは、設定を弄ってない場合はPylanceを意識せずに使ってる状態なんですね。
とりあえずこれで無事にLiteralも推測候補が表示されるようになりました。
mypyをPyrightに変更
これで当初の問題は解決したのですが、Pylanceには型チェック機能としてPyrightを使用しているとのことで、どうせならmypy以外も使ってみようと変更することにしました。
// 削除 "python.linting.mypyEnabled": true,
"python.analysis.typeCheckingMode": "strict",
これでPylanceの型チェッカー(Pyright)が有効化されます。 pylanceが内部に持っているようで、mypyのようにpipで追加インストールする必要はないようです。
Microsoft Language Serverを動作させてるためにお約束で使用されてきた"python.jediEnabled": false, が「構成なし」と表示されるようになっていたので、"python.languageServer"に統合されたんでしょうか?
mypyとpyrightのエラー表示の違い
ついでなので、それぞれの型チェッカーのエラー表示の違いを記録してみました。
代入時の型の間違い
文字列に数値を入れた場合
hoge: str = ''
hoge = 12
print(f'{hoge}')
mypyのエラーメッセージ
Incompatible types in assignment (expression has type "int", variable has type "str")
pylanceのエラーメッセージ
Expression of type "Literal[12]" cannot be assigned to declared type "str"
"Literal[12]" is incompatible with "str"
Literal型
今回の発端となったLiteral型のエラーメッセージ
def test_literal() -> None:
Items = Literal['hoge', 'huga']
def print_item(arg: Items) -> None:
logger.debug(f'{arg=}')
print_item('piyo')
mypyのエラーメッセージ
Argument 1 to "print_item" has incompatible type "Literal['piyo']"; expected "Union[Literal['hoge'], Literal['huga']]"
Pylanceのエラーメッセージ
Argument of type "Literal['piyo']" cannot be assigned to parameter "arg" of type "Literal['hoge', 'huga']" in function "print_item"
Type "Literal['piyo']" cannot be assigned to type "Literal['hoge', 'huga']"
"Literal['piyo']" cannot be assigned to type "Literal['hoge']"
"Literal['piyo']" cannot be assigned to type "Literal['huga']"
エラー時のアンダーライン表示の違い
Literal型の方のエラーは、mypyだとエラー部分の頭しかアンダーラインが表示されません。
pylanceだと全体に引かれました。こちらの方が視認性が高いですね。
まとめ
どちらもしっかりとエラーを表示していますが、どちらかといえば複数行で表示してくれるPylanceの方が好みでした。 後、mypyのようにプロジェクト毎にpip installしなくても使えるのは便利です。 やはり両方ともMicroSoft製ということもあり、VSCodeとの親和性はPylanceの方が高い感じはしますね。 しばらくはPylanceの型チェッカーを使っていこうと思います。