
mypyは、Pythonの型ヒント(PEP 484)を読み取り、関数の引数や戻り値の整合性をコンパイル前に検証する静的型チェッカである。Jukka Lehtosalo氏が2012年頃から開発を開始し、後にDropboxへ移籍した同氏のもとで本格的な実装が進んだ経緯を持ち、現在は同社をはじめInstagramやLinkedInなど、巨大なPythonコードベースを抱える企業の保守作業を支える要となっている。実行前にバグを発見し、IDEの補完を強化し、リファクタリングの心理的負担を下げる、その三役を一手に担うツールとして広く採用されている。
この記事の目次
- 型ヒント仕様とmypyの関係
- 段階導入を支える設定機構
- 実行性能とdaemonモード
- 他チェッカと併用する勘所
- まとめ
型ヒント仕様とmypyの関係

Pythonは動的型付け言語として設計されたが、2014年に採択されたPEP 484で関数シグネチャに型を書く構文が正式に加わった。この仕様策定にあたってはGuido van Rossum氏とJukka Lehtosalo氏が共同で提案文書を執筆しており、mypyはその参照実装に近い位置づけで歩んできた経緯がある。つまりmypyの挙動はそのままPython公式の型システムの解釈を示すものとして読まれる側面があり、後発のpyrightやpyreといった検査器も、まずmypyとの整合性を取りに行く形で機能を実装している。
型ヒント自体は実行時には単なるメタデータでしかなく、Pythonインタプリタは値を強制したり例外を出したりしない。そこに別プロセスで静的解析をかけ、矛盾を指摘するのがmypyの役割である。List[int]に文字列を入れようとしている、Optional[T]からNoneチェックなしに属性アクセスしている、そうしたミスを実行前に拾えるため、テストでは見落としがちな分岐や、滅多に通らないエラーパスにも光を当てられる。
段階導入を支える設定機構

既存の大規模Pythonプロジェクトへ型を持ち込むとき、いきなり全コードを厳密モードで通すのは現実的ではない。mypyはこの実情を踏まえ、設定ファイルmypy.iniやpyproject.tomlの[tool.mypy]セクションで、モジュールごとに厳しさを切り替えられるよう設計されている。まずは新規ファイルだけdisallow_untyped_defsを有効にし、ライブラリの型情報が不足する箇所はignore_missing_importsで一時的に除外する、といった段階的な導入が一般的な進め方である。
厳格度を最大まで上げたいときは--strictオプションが用意されており、未定義の型、暗黙のAny、Noneチェック漏れなど主要な検査をまとめて有効化できる。一方で開発の途中段階や、移植中のレガシーコードに対しては行末コメントの# type: ignoreで個別に警告を抑制でき、TODOを残しながら徐々に手当てしていく運用がやりやすい。型情報のないサードパーティライブラリ向けには、Typeshedや個別のstubsパッケージを別途読み込ませる方式が採られている。
実行性能とdaemonモード

型検査は大きなコードベースだと時間がかかる作業で、mypyの初回フルチェックは数十秒から数分に及ぶこともある。そこで開発者の手元では、dmypyというdaemonモードを利用するのが現実的な選択肢になる。dmypyは一度起動するとAST情報をメモリに常駐させ、ファイルが変更された差分だけを再解析する仕組みで、VS CodeのPython拡張やpre-commitの待ち時間を大幅に短縮できる。
実装面では、もともと純粋なPythonで書かれていたmypyの内部処理が、後にmypyc経由でCython類似のネイティブコードにコンパイルされるようになり、起動時の重さが目に見えて改善されてきた経緯がある。mypycはmypyのチームがその副産物として開発したCコード生成器であり、自分たちの製品で自分たちのコンパイラをドッグフーディングしている格好になる。結果として、CIサーバ上での実行時間も短縮され、毎プルリクエストでフル検査をかけるという運用が現実的になった。
他チェッカと併用する勘所

Pythonの静的型チェッカは複数の実装が並立しており、mypyのほかにMicrosoftのpyright、Metaのpyre、Googleのpytypeなどが知られている。それぞれ思想が異なり、たとえばpyrightはエディタ統合での応答速度を重視し、pytypeは型ヒントが書かれていないコードからの推論に強い。mypyは仕様策定の中心にいた経緯から、Python公式の型仕様にもっとも忠実という強みを持ち、ライブラリ作者がドキュメントとして型を整える際の基準器として使われることが多い。
現実のプロジェクトでは、ローカルではpyrightをエディタに常駐させ、CIではmypyで最終確認するというハイブリッド構成も珍しくない。両者で警告の出方が微妙に異なるため、どちらの結果を真とするかをチームで決めておく必要がある。またmypyは黒猫アイコンと「Optional static typing for Python」というキャッチコピーが象徴的で、オープンソースコミュニティの中では、Pythonに型を入れる文化そのものの代名詞として扱われている。
まとめ
mypyは、Pythonの静的型システムを公式仕様の参照実装に近い位置で支え続けてきたチェッカである。段階導入を許す設定、dmypyによる差分解析、mypycでのネイティブ化と、運用面での磨き込みも進んでいる。型ヒントを書く文化を組織に根付かせる足がかりとして、まずは新規モジュールでmypyを走らせるところから始めると効果が見えやすい。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント