今回は、Pythonで引数や戻り値の型を指定する方法についてご紹介します。
型ヒント(type hints)とは
Pythonでは、type hintsを用いて関数の引数や戻り値に期待される型を明示的に記述することができます。
これはコードの可読性を高め、静的解析ツール(例:mypy)を使用した型チェックを容易にする利点があります。
実行時に型が強制されるわけではなく、あくまでプログラムを読みやすくし、バグを事前に発見しやすくする仕組みです。
mypyについては以下の記事でまとめています。

基本的な書き方と使用例
引数と戻り値の型指定は、関数定義時にコロン(:)とアロー(->)を使って行います。
次の例では、引数aとbにint型を、戻り値にint型を期待することを示しています。
1 2 |
def add(a: int, b: int) -> int: return a + b |
上記のように記述しておくと、静的解析ツールが型の不一致などを検出しやすくなります。
実行時には強制されないため、型と異なる値を渡してもエラーにならない点には注意が必要です。
複数の型やコレクション型の指定方法
関数の引数や戻り値に、複数の型が入る可能性がある場合は、Unionを使います。
1 2 3 4 |
from typing import Union def process(value: Union[int, str]) -> str: return str(value) |
Noneが渡される可能性がある場合は、Optionalを使う方法があります。
1 2 3 4 5 6 7 |
from typing import Optional def greet(name: Optional[str]) -> str: if name is None: return "Hello, Guest!" else: return f"Hello, {name}!" |
Hello, Guest!
上の例では、引数nameにNoneを渡した場合には”Hello, Guest!”を返すようになっています。
また、リスト(List)や辞書(Dict)などのコレクション型にも明示的に型を指定できます。
1 2 3 4 5 6 7 8 9 10 |
from typing import List, Dict def sum_list(numbers: List[int]) -> int: return sum(numbers) def word_count(text: str) -> Dict[str, int]: counts = {} for word in text.split(): counts[word] = counts.get(word, 0) + 1 return counts |
上記のように書くことで、リストの要素がint型であることや、返される辞書のキーがstr、値がintになることを明確に示せます。
よくあるエラーと注意点
type hintsはあくまでも静的解析用の情報です。
以下のような点に注意するとスムーズに活用できます。
- 実行時には型チェックが行われない:実際に型を強制するにはmypyなどのツールを別途使用する必要があります。
- Pythonのバージョン互換性:バージョンによってサポートされている型ヒントの機能が異なる場合があります。
- 複雑な型指定は可読性に影響:Unionやジェネリック(TypeVar)などを使いすぎるとコードが読みづらくなる可能性があります。
また、type hintsを適切に記述していない場合や、静的解析ツールと実際のコードが乖離している場合には、ツール側でタイプエラーと判定されることもあります。
エラー対処には以下のような方法があります。
- 型を再確認:関数や変数がどのような値を扱うかを見直す。
- type: ignoreコメント:必要に応じて型チェックを無視する(非推奨だが、仕方がないケースも存在)。
- 外部ライブラリの型定義:サードパーティライブラリの型定義(スタブ)を導入する。
まとめ
Pythonの型ヒントはコードの可読性と保守性を高めるための強力な仕組みです。
実行時の型チェックは行われませんが、mypyなどのツールと組み合わせることでバグを早期に発見できます。
必要な範囲で型指定を行い、複雑になりすぎないよう注意しながら活用してみてください。