MyPy
表示
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
コンテナ型の型ヒント
[編集]List
やDict
などのコンテナ型に型ヒントを指定できます。
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のダイナミックな特徴(例:
eval
やexec
)には対応できません。
MyPyの静的解析ツールとしての利点
[編集]- バグの早期発見
- ドキュメントとしての役割を持つ型ヒント
- チーム開発における型の明確化
ベストプラクティス
[編集]- 型ヒントを段階的に導入し、少しずつ型安全性を向上させる。
strict
モードを活用して厳密な型チェックを行う。- 動的型の部分は
Any
型や型ガードで適切に対応。
トラブルシューティング
[編集]エラー例 | 解決策 |
---|---|
error: Cannot find module named 'xxx'
|
ignore_missing_imports を設定する
|
error: Missing type annotations
|
関数や変数に型アノテーションを追加する |
このハンドブックをもとに、MyPyを活用して型安全なPythonコードを実現しましょう!