コンテンツにスキップ

MyPy

出典: フリー教科書『ウィキブックス(Wikibooks)』

MyPyとは

[編集]

MyPyは、Pythonコードに型安全性をもたらす静的解析ツールです。Python型ヒント(Type Hints)を活用して、コード中の型の不一致を検出します。

主な特徴:

  • 静的解析: 実行前にコードの型エラーを発見できる。
  • 型ヒントとの統合: Pythonの型ヒント機能を前提に動作する。
  • 柔軟性: 動的型付けと静的型付けを組み合わせられる。

インストールと基本設定

[編集]

MyPyのインストール

[編集]

MyPyはPythonのパッケージ管理ツールpipを用いてインストールします。

pip install mypy

MyPyの初期設定

[編集]

MyPyの動作をカスタマイズするために、設定ファイルを用意します。以下はmypy.iniの例です:

mypy.ini
[mypy]
python_version = 3.9
strict = True
ignore_missing_imports = True
disallow_untyped_defs = True

MyPyの基本的な使い方

[編集]

型チェックの実行方法

[編集]

MyPyで型チェックを行うには、mypyコマンドを使います。

mypy your_script.py

チェック結果の読み方

[編集]

エラーが発見された場合、以下のような形式で出力されます:

your_script.py:10: error: Argument 1 to "add" has incompatible type "str"; expected "int"

ここでは、10行目の関数addの引数に型の不一致があることを示しています。

型ヒントとMyPy

[編集]

基本的な型ヒント

[編集]

Pythonの型ヒントを用いることで、MyPyが型を検査します。

def add(x: int, y: int) -> int:
    return x + y

コンテナ型の型ヒント

[編集]

ListDictなどのコンテナ型に型ヒントを指定できます。

from typing import List, Dict

def get_names() -> List[str]:
    return ["Alice", "Bob"]

ユニオン型とOptional型

[編集]

複数の型を許容する場合にはUnionを使います。値がNoneを許容する場合はOptionalを用います。

from typing import Union, Optional

def get_value(x: Optional[int]) -> Union[int, str]:
    if x is None:
        return "No value"
    return x

MyPyの応用的な使い方

[編集]

動的型付けコードへの適用

[編集]

動的型付けのコードに対して型ヒントを追加する場合、Any型を使用できます。

from typing import Any

def process_data(data: Any) -> None:
    print(data)

型ガード

[編集]

型を条件に応じて絞り込むには、型ガードを使用します。

from typing import Union

def process(value: Union[int, str]) -> None:
    if isinstance(value, int):
        print(value + 1)  # MyPyはここでvalueをint型と認識
    else:
        print(value.upper())

MyPy設定ファイルの詳細

[編集]

設定ファイルには多くのオプションがあります。以下は主なオプションの例です:

設定項目 説明
ignore_missing_imports モジュールのインポートエラーを無視する
strict 複数の厳密な型チェックオプションを有効にする
disallow_untyped_defs 型アノテーションのない関数を許可しない
allow_untyped_calls 型アノテーションのない関数呼び出しを許可する

pyproject.tomlを使用する場合:

[tool.mypy]
python_version = "3.10"
strict = true
ignore_missing_imports = true

型チェックの制限と注意点

[編集]
  • 実行時型チェックの非対応: MyPyは静的解析ツールであり、実行時に型チェックを行いません。
  • 動的コードへの制限: Pythonのダイナミックな特徴(例: evalexec)には対応できません。

MyPyの静的解析ツールとしての利点

[編集]
  • バグの早期発見
  • ドキュメントとしての役割を持つ型ヒント
  • チーム開発における型の明確化

ベストプラクティス

[編集]
  • 型ヒントを段階的に導入し、少しずつ型安全性を向上させる。
  • strictモードを活用して厳密な型チェックを行う。
  • 動的型の部分はAny型や型ガードで適切に対応。

トラブルシューティング

[編集]
エラー例 解決策
error: Cannot find module named 'xxx' ignore_missing_importsを設定する
error: Missing type annotations 関数や変数に型アノテーションを追加する

このハンドブックをもとに、MyPyを活用して型安全なPythonコードを実現しましょう!