3秒でわかる
Pythonの引数や戻り値に想定する型を書き添える記法。実行は止めない代わりに、検査ツールと補完が誤りを先に見つけます。
もう少し詳しく
どういうものか
型ヒントは、変数や引数、戻り値がどんな型を想定しているかをコードに書き添える記法です。Python本体はこの記述を読み飛ばすため、想定と違う値を渡しても実行時に例外にはなりません。価値を生むのは mypy や pyright といった検査ツールとエディタで、書いてある型をもとに矛盾を実行前に指摘し、補完の精度も上げます。
なぜ必要か
引数の data に何が入るのかは、名前だけでは分かりません。辞書のリストなのか、DataFrameなのか、読み手は関数の中を全部たどるか、呼び出し元を探すことになります。型を1行書いておけば、その調査が消えます。返り値が None になりうることも明示できるため、None を素通しして落ちる事故が減ります。人数が増えた開発では、この注釈が読み手向けの最小限の仕様書として働きます。
具体例
from dataclasses import <a href="/glossary/dataclass" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">dataclass</a>
@dataclass
class User:
id: int
name: str
def find_user(users: list[User], user_id: int) -> User | <a href="/glossary/none" class="text-primary font-medium underline underline-offset-2 hover:text-primary-dark">None</a>:
for u in users:
if u.id == user_id:
return u
return None
def total_price(prices: dict[str, int], tax: float = 0.1) -> int:
return round(sum(prices.values()) * (1 + tax))検査は実行とは別に走らせます。
pip install mypy
mypy app.pyつまずきやすいところ
書いたのだから守られる、と思い込む誤解が最も多く見られます。検査ツールを動かさない限り、型ヒントはただのコメントと同じです。CIに mypy を入れて初めて効きます。もうひとつ、Optional を付けずに None を返す関数です。呼び出し側が属性アクセスして落ちる典型で、返り値に | None を書いておけば検査が事前に止めてくれます。既定値に [] や {} を書く癖も、型とは別の問題として事故を生みます。
似た用語との違い
| 語 | 内容 |
|---|---|
| 型ヒント | 想定する型の注釈 実行時は無視される |
| 静的型付け | 言語側が実行前に型を強制する仕組み |
| 実行時検証 | pydantic などが動作中に値を確かめる処理 |
覚え方
型ヒントは審判ではなく標識です。標識を読む道具を入れて初めて、走る前に間違いへ気づけるようになります。