
2026/03/16 21:25
**Python型チェッカー比較:タイプ指定に対する適合性**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
Python の型指定仕様には、約 100 ファイルからなる適合テストスイートがあり、型チェッカーがそのルールをどれだけ正確に実装しているかを測定します。
不一致の種類は二つ追跡されます:誤検出(エラーがないべきところで報告する)と見逃し(期待されたエラーを検知できない)。2026 年 3 月初旬時点での結果は次の通りです。
| Tool | Pass % | False Positives / Negatives |
|---|---|---|
| pyright | 97.8 % | 154 FP |
| zuban | 96.4 % | 100 FN |
| pyrefly | 87.8 % | 52 FP |
| mypy | 58.3 % | 231 FN |
| ty | 53.2 % | 159 FN |
これらの数値を集計したダッシュボードは、ベータリリースが頻繁に登場するため、しばしば最新情報から遅れます。
適合性は重要です。スコアが低いと開発者はコードを書き直す必要があったり、キャストを追加したり、エラー抑制を行う必要があります。しかし、このスイートは注釈付きコードの意味論のみをテストし、推論や縮小/洗練、実験的型(交差型・否定型・匿名
TypedDict・テンソル形状型)はカバーしていません。その結果、推論動作はチェッカーごとに大きく異なり、多くの実際のパターンがまれなエッジケースよりも頻繁にテストされます。
型チェッカーを選択する際には、開発者は推論品質、大規模コードベースでの性能、IDE 統合(LSP サポート)、エラーの明確さ、およびサードパーティーパッケージとの互換性(例:Django、Pydantic)も考慮すべきです。Pyrefly は現在仕様の主要機能をすべてサポートしており、残っているギャップは今後数か月で埋める計画です。将来の記事では適合性以外の次元を探求し、異なるツールが型付け課題にどのように取り組んでいるかを比較します。
本文
Python を文字通り書くとき、型チェッカーは言語仕様に従って動作することを期待します。しかし、今日の型チェッカーが実際に Python の typing スペックにどれほど忠実であるかは?
本稿では「typing‑spec 一貫性」が意味するもの、各種型チェッカーの比較、そして一貫性スコアだけでは分からないことを探ります。
Typing Specification の簡史
Python の型システムは PEP 484 で始まりました。当時のセマンティクスはほとんどがリファレンス実装 mypy によって定義されており、実際には mypy が実装したものが事実上の仕様となっていました。
その後、Pyright(Microsoft)、Pytype(Google)、Pyre(Facebook)など多くのチェッカーが登場し、型システム自体も数多くの PEP を経て進化しました。この結果、セマンティクスは複数の文書に散らばり、各チェッカーでわずかな解釈の違いが生まれました。
そこで typing コミュニティはルールを一つのリファレンスへ統合し、Python typing specification を作成しました。これは型付け機能のセマンティクスを記述し、チェッカーが実装度を測定できる コンフォーマンステストスイート を含んでいます。
Typing Conformance Test Suite
このテストスイートは約 100 個のファイルから構成され、それぞれに「エラーを出すべき行」や「エラーを出さないべき行」の期待値がアノテーションとして記載されています。チェッカーがファイルを走査すると、次の二種類の不一致が発生します。
| 不一致 | 説明 |
|---|---|
| 偽陽性 | チェッカーがエラーを報告したが、その行はエラー対象としてマークされていない。 例: をサポートしていないと が未知のキーとしてフラグ付けされる。 |
| 偽陰性 | テストではエラーが期待されるが、チェッカーが報告しない。 例: で追加項目は真偽値でなければならないにも関わらず、整数を無視してしまうケース。 |
公開のコンフォーマンスダッシュボードではこれらの結果を集計し、各チェッカーがどれだけテストに合格したかを示します。以下は 2026 年 3 月初旬(コミット 62491d5c9cc1dd052c385882e72ed8666bb7fa41)時点の概要です。
| Type Checker | 完全合格 | 合格率 | 偽陽性 | 偽陰性 |
|---|---|---|---|---|
| pyright | 136/139 | 97.8 % | 154 | zuban |
| zuban | 134/139 | 96.4 % | 100 | - |
| pyrefly | 122/139 | 87.8 % | 5221 | - |
| mypy | 81/139 | 58.3 % | 23176 | - |
| ty74 | 53/139 | 32 % | 159211 | - |
Pyrefly は既に主要な型システム機能をサポートしており、残りのギャップは今後数か月で埋められる見込みです。なお、Pyrefly・ty・Zuban はすべてベータ段階で積極的に開発中なので、最新情報は随時確認してください。
なぜコンフォーマンスが重要なのか
実務上、コンフォーマンスが重要と言えるのでしょうか? たとえば mypy(リファレンス実装・業界標準)はテストケースのわずか 57 % にしか完全に合格しません。
実際には、チェッカーの一貫性が低いほど、制限や不整合を回避するためにコードを再構成せざるを得なくなります。例えば、仕様で推奨されているパターンに従い、ドキュメントで「この typing 構造は機能すべき」と記載されていても、実際のチェッカーがその部分を正しく実装していない場合があります。
自分のコードで高度な機能を使わなくても、ライブラリから何かをインポートしたときに問題が発生することがあります。冗長な
cast を追加したり、不要なエラーを抑制したり、既存の動作しているコードを構造変更したりしなければならないケースです。
コンフォーマンスが測定しないもの
コンフォーマンスは機能完備度のベンチマークとして有用ですが、以下の点で限界があります。
| 限界 | 内容 |
|---|---|
| 不一致の重要性 | テスト全てが同じ重みではなく、一般的なパターンと稀にしか現れないエッジケースが混在。 |
| 標準化されていない要素 | 例えば ・型推論 – アノテーションが欠けた場合の推論方法は自由であり、未アノテートコードへのチェック厳格さもツールに委ねられる。 ・リファインメント/ニアリング – 実行時チェックによる型制限は部分的しか規定されていない( 、、、 など)。・実験的機能 – 交差型、否定型、匿名 typed dict、テンソル形状型(今後追加予定)等。 |
結論
型チェッカーを選ぶ際、コンフォーマンスは「正式な typing 規則にどれだけ従っているか」を示す有用な指標の一つです。しかし開発者体験はそれ以外にも多くの要因で決まります。
| 要素 | 重要ポイント |
|---|---|
| 推論品質 | アノテーションがない箇所をどれだけ正確に推論できるか。 |
| 性能 | 大規模コードベースでの速度。 |
| IDE 統合 | Language Server Protocol(LSP)への完全対応度。 |
| エラーメッセージ | 明瞭で実行可能なものか、あるいは難解か。 |
| サードパーティパッケージ対応 | Django、Pydantic など特殊扱いが必要なライブラリをどう扱うか。 |
今後の投稿ではこれらのディメンションを掘り下げ、各型チェッカーがどのように取り組んでいるか比較します。まずは Pyrefly を試してみるか、Discord や GitHub で議論に参加してみてください。