thumbnail_python_logo

チェックツールをmypyからPylance(Pyright)に変更

公開日2021.07.27

Pythonの型チェックといえばmypyが定番ですね。 私も3.5で型アノテーションが実装されて以降ずっと使っていたのですが、最近Microsoft製のPylance(Pyright)に変更したのでその記録です。

目次目次
  • Language ServerをPylanceに変更
  • mypyをPyrightに変更
  • mypyとpyrightのエラー表示の違い
  • 代入時の型の間違い
  • Literal型
  • エラー時のアンダーライン表示の違い
  • まとめ

Language ServerをPylanceに変更

環境はVSCode 1.58.2で拡張機能のPythonPylanceは既にインストール済みです。

VSCodeでPythonの新機能を確認していて、from typing import Literal しようとしたら Literal が候補に表示されなかったのが発端です。

changed python type checking tool from mypy LS Microsoft

当初はvenv環境が更新されていないのかと思ってチェックしたのですが、pythonのバージョンは3.9.6ですし、pip list -o でチェックしても、pip のライブラリは最新になっているのに何で?

これはLanguage Serverを"Microsoft"から"Pylance"に変更することで解決しました。 具体的には、VSCodeのsetting.jsonで既にあった設定を書き換えるだけです。

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を意識せずに使ってる状態なんですね。

changed python type checking tool from mypy LS Pylance

とりあえずこれで無事にLiteralも推測候補が表示されるようになりました。

mypyをPyrightに変更

これで当初の問題は解決したのですが、Pylanceには型チェック機能としてPyrightを使用しているとのことで、どうせならmypy以外も使ってみようと変更することにしました。

setting.json
// 削除 "python.linting.mypyEnabled": true,

"python.analysis.typeCheckingMode": "strict",

これでPylanceの型チェッカー(Pyright)が有効化されます。 pylanceが内部に持っているようで、mypyのようにpipで追加インストールする必要はないようです。

changed python type checking tool from mypy jediEnable

Microsoft Language Serverを動作させてるためにお約束で使用されてきた"python.jediEnabled": false, が「構成なし」と表示されるようになっていたので、"python.languageServer"に統合されたんでしょうか?

mypyとpyrightのエラー表示の違い

ついでなので、それぞれの型チェッカーのエラー表示の違いを記録してみました。

代入時の型の間違い

文字列に数値を入れた場合

    hoge: str = ''
    hoge = 12
    print(f'{hoge}')

mypyのエラーメッセージ

mypy
Incompatible types in assignment (expression has type "int", variable has type "str")

pylanceのエラーメッセージ

Pyrigh
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のエラーメッセージ

mypy
Argument 1 to "print_item" has incompatible type "Literal['piyo']"; expected "Union[Literal['hoge'], Literal['huga']]"

Pylanceのエラーメッセージ

Pyrigh
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だとエラー部分の頭しかアンダーラインが表示されません。

changed python type checking tool from mypy underline mypy

pylanceだと全体に引かれました。こちらの方が視認性が高いですね。

changed python type checking tool from mypy underline pylance

まとめ

どちらもしっかりとエラーを表示していますが、どちらかといえば複数行で表示してくれるPylanceの方が好みでした。 後、mypyのようにプロジェクト毎にpip installしなくても使えるのは便利です。 やはり両方ともMicroSoft製ということもあり、VSCodeとの親和性はPylanceの方が高い感じはしますね。 しばらくはPylanceの型チェッカーを使っていこうと思います。

Top
Back to Top
トップへ戻る