コンテンツへスキップ
LatchkeyLatchkey home

mypy vs Pyright: CIに適したPythonの型チェッカーはどちら?

mypyはPythonのリファレンス型チェッカーで、PyrightはVS CodeのPylanceも支える高速で厳格なチェッカーです。

mypyはPython向けのオリジナルで広く使われている静的型チェッカーであり、タイピング標準とともにメンテナンスされています。Pyright (Microsoft製) はTypeScriptで実装されたチェッカーで、強力な推論、速度、Pylance経由のVS Codeとの緊密な統合で知られています。

mypy vs Pyright at a glance

mypyPyright
速度中程度高速 (インクリメンタル、watch mode)
推論良好強力
エディタ統合plugin/LSP経由ネイティブ (Pylance/VS Code)
厳格さの制御粒度の細かいflag粒度が細かい、strict mode
リファレンスの地位タイピングのリファレンス実装独立、広く使われている
言語サーバーなしあり。VS CodeのPylanceを支える
実装言語Python、mypycでコンパイルTypeScript
設定mypy.inisetup.cfgpyproject.tomlpyrightconfig.jsonpyproject.toml

CIにおいて

どちらも型エラーで失敗するCIゲートとして動作します。Pyrightは一般的に高速で強力な推論を持ち、mypyが見逃す問題を捉えられることがあり、素早いフィードバックを与えます。エディタ (Pylance) とCIで同じチェッカーを走らせると結果に一貫性が保たれます。mypyはリファレンス実装であり、公式のタイピングセマンティクスに最も近く、既存の設定やstubの大きな蓄積があります。カバレッジを最大化するために両方を走らせるプロジェクトもあります。

Comparing like for like
# mypy, checking what Pyright checks by default
mypy --check-untyped-defs src/

# or go all the way
mypy --strict src/

# Pyright at its default (already checks everything)
pyright src/

# Pyright at basic, if the default is too much to adopt at once
pyright --level basic src/

pipeline向けの選択

速度とVS Code/Pylanceとのエディタ一致が欲しい: Pyright。リファレンスチェッカーとタイピング標準への最も近い一致が欲しい: mypy。結果が再現的になるよう、CIでバージョンと厳格さのflagを固定しましょう。

  • Joins versus unions. When merging types across branches, mypy joins to a common supertype while Pyright forms a union. Pyright documentation states that joins discard valuable type information and lead to many false positive errors.
  • Literal preservation. (1, "stop") gives Pyright Literal["stop"] and gives mypy str. If you use literal types for state machines or discriminated unions, mypy widening them costs you the checking you wanted.
  • Variable declarations. mypy treats a first assignment as an implicit declaration; Pyright infers a union across assignments. mypy behaviour is the more surprising of the two when a variable legitimately holds different types over its life.

速度: 定説はいま争点になっている

Pyrightのドキュメントは、大規模コードベースでmypyより3〜5倍速いと述べており、これが長年の通説でした。2026年においては、より慎重に扱う価値があります。

  • この数字は、mypyがmypycでコンパイルされたバイナリとして配布されるようになる前、また1.18の最適化作業より前のものです。この作業はmypy自身のコードベース上で大きな改善をもたらしました。
  • 最近の独立した比較では、現行のmypyはPyrightと互角で、場合によっては上回るとされています。
  • どちらも最新の参入者には大きく後れを取っています。Metaのpyreflyは2026年5月に安定版1.0に到達し、両者に対して10〜50倍を報告しています。Astralのtyはまだアルファです。

pluginはPyrightにできない唯一のこと

これはこの比較で最も明確な二者択一です。mypyはpluginに対応し、Pyrightにplugin機構はなく、メンテナは今後も導入しないと述べています。

  • Djangoのモデルは属性を動的に生成します。django-stubs とそのmypy pluginがなければ型チェッカーはそれを追えず、Pyrightはそのpluginを読み込めません。
  • SQLAlchemyの宣言的モデルも同じ形の問題を抱えます。
  • コードベースがどちらかに依存しているなら、この比較の他の部分が何を言おうと、mypyのplugin対応は好みではなく必須要件です。

どちらかをCIで動かす

.github/workflows/ci.yml
# mypy
- run: pip install mypy
- run: mypy --strict src/

# Pyright, with machine-readable output for annotations
- run: pip install pyright
- run: pyright --outputjson src/ > pyright.json

# Adopting gradually: fail only on files already clean
- run: mypy src/ --strict --exclude "src/legacy/.*"

両方使えるか?

はい。大規模なコードベースの一部はそうしていますが、見返りは思ったより狭いものです。PylanceによるエディタでのPyrightと、CIのゲートとしてのmypyという分担はよくある形です。入力中はPyrightの推論を得つつ、正しさを強制する場所ではmypyのplugin対応が効くからです。

  • 代償は、一致していなければならない2つの設定を維持すること、あるいはエディタとCIが食い違うのを受け入れることです。
  • 食い違いは仮定の話ではありません。上記の推論の違いは、同じコードに対して実際に異なる判定を生みます。
  • 多くのチームにとって、きちんと設定した1つのチェッカーは、おおよそ設定した2つに勝ります。

Benchmark on your repository before choosing

Build-tool benchmarks published by vendors use repositories chosen to show a difference. Yours is the only one that matters, and both a cold and a warm measurement are needed because CI mostly runs cold.

Terminal
# cold: no cache, the CI condition
rm -rf node_modules/.cache dist && time <tool> build

# warm: the local development condition
time <tool> build

# and the one people forget: incremental after a one-line change
echo "// touch" >> src/index.ts && time <tool> build

The verdict

高速なチェックとエディタとの一致が欲しい: Pyright。タイピング標準に沿ったリファレンスチェッカーが欲しい: mypy。どちらも堅実なCIゲートになります - バージョンと厳格さを固定し、最大のカバレッジのために両方を走らせることも検討しましょう。

よくある質問

なぜPyrightはmypyより多くのエラーを報告するのですか?
厳密さではなく、主に既定値のせいです。mypyは --check-untyped-defs--strict を渡さない限り注釈のない関数を飛ばしますが、Pyrightは既定ですべてのコードを検査し、mypyが Any と仮定する箇所で戻り値の型を推論します。mypy --check-untyped-defs を実行すると差は大きく縮まります。
Pyrightはmypyより速いですか?
Pyrightのドキュメントは大規模コードベースで3〜5倍速いと述べていますが、その数字はmypyのmypycコンパイル版と1.18の最適化作業より前のもので、最近の独立した比較では現行mypyが互角とされています。どちらの主張にも頼らず、自分のリポジトリでベンチマークしてください。
Pyrightはmypyのpluginに対応していますか?
いいえ。Pyrightにplugin機構は一切ありません。動的に生成されるモデル属性を理解するために django-stubs やSQLAlchemyのmypy pluginに依存しているなら、その要件だけでこの比較の結論が決まります。
Pyrightのstrictモードは実際に何を変えますか?
すでにすべてを検査している既定の上に、およそ30の追加ルールを有効にします。すべての関数の引数と戻り値に注釈を必須にすることも含まれます。報告エラーが約10倍に増えるのが一般的なので、リポジトリ全体ではなくディレクトリ単位で有効にしてください。
新規プロジェクトではmypyとPyrightのどちらを使うべきですか?
DjangoかSQLAlchemyを使っているのでなければPyrightです。既定ですべてを検査し、unionやリテラル型に対する推論の挙動が優れており、Pylanceの背後にある言語サーバーを提供するため、エディタとチェッカーの判断が一致します。
tyとpyreflyとは何ですか?
速度を目的に作られた新しいPythonの型チェッカーです。Metaのpyreflyは2026年5月に安定版1.0に到達し、大規模コードベースでmypyとPyrightより10〜50倍速いと報告しています。Astralのtyは2026年半ば時点でまだアルファでした。どちらも注目に値しますが、mypyやPyrightほどのエコシステムの成熟度はまだありません。
エディタでPyright、CIでmypyを使えますか?
はい、よくある分担です。Pylance経由で入力中はPyrightの推論を得て、強制されるゲートとしてmypyのplugin対応を使います。代償は一致を保つべき2つの設定であり、推論の違いにより同じコードについて実際に判断が食い違い得ます。
誰も変更していないコードで型チェックが落ちるのを防ぐには?
CIでチェッカーのバージョンを固定してください。どちらのツールもマイナーリリースでルールを追加し推論を鋭くするため、固定しないと無関係な依存関係の更新でビルドが赤くなり得ます。固定したうえで、独立したプルリクエストとして意図的に更新してください。

関連ガイド