Pythonのタイプヒントを徹底解説!

Pythonのタイプヒントは、変数や関数の引数、戻り値がどのようなデータ型(例: strint)を期待しているかをコード内に明記するためのメモ書きのようなものです。🏷️

一番大事なのは、このヒントはあくまで「ヒント」であり、Pythonのプログラム実行自体には何の影響も与えないということです。書かなくてもコードは動きますし、書いてあってもPythonがそれを強制することはありません。


なぜタイプヒントを使うのか?

実行に影響しないなら、なぜわざわざ書くのでしょうか?それには、計り知れないメリットがあるからです。

  • コードの可読性が劇的に向上する関数の定義を見ただけで、その関数がどんなデータを必要とし、どんなデータを返すのかが一目瞭然になります。これは、未来の自分や他のチームメンバーにとって最高のドキュメントになります。
  • バグを事前に発見できる 🧐Mypyのような静的解析ツールを使うと、コードを実行する前に「この関数には数値を渡すべきなのに、文字列が渡されていますよ!」といった型の間違いを自動で検出してくれます。これにより、多くのバグを未然に防げます。
  • エディタのサポートが強力になるVS Codeなどのコードエディタはタイプヒントを解釈し、より正確な自動補完やエラー警告を表示してくれます。例えば、変数がstr型だと分かっていれば、.upper()のような文字列専用のメソッドを候補に出してくれます。

基本的な書き方 ✍️

タイプヒントの書き方はとても直感的です。

変数の場合

変数名の後にコロン: を書き、その後に型を記述します。

user_name: str = "Yusei"
user_age: int = 28
is_active: bool = True

関数の場合

関数の引数には変数と同じように、戻り値には -> の後に型を記述します。戻り値がない関数は -> None と書くのがお作法です。

# name引数はstr型、戻り値もstr型
def greet(name: str) -> str:
    return f"Hello, {name}"

# message引数はstr型、戻り値はない
def print_message(message: str) -> None:
    print(message)


もう少し複雑な型

リストや辞書など、コンテナの型を指定するには typing モジュールを使うと便利です。(Python 3.9以降は、listdictをそのまま使えます)

from typing import Optional

# 整数のリスト
scores: list[int] = [100, 85, 90]

# 文字列をキーとし、値が文字列または数値の辞書
# `|` は「または」を意味します
user: dict[str, str | int] = {"name": "Yusei", "age": 28}

# 文字列またはNoneを返す可能性がある関数
# Optional[str] は str | None と同じ意味です
def find_user(user_id: int) -> Optional[str]:
    if user_id == 1:
        return "Yusei"
    else:
        return None


まとめ

タイプヒントは、現代のPython開発において必須のスキルと言っても過言ではありません。

  • コードを分かりやすくする「注釈」である。
  • 実行には影響しないが、開発体験を大きく向上させる。
  • Mypyなどのツールと組み合わせることで、バグを減らせる。

最初は少し面倒に感じるかもしれませんが、小さなプロジェクトからでも書く習慣をつけることで、将来的に大規模なアプリケーションを開発する際に必ずその恩恵を感じるはずです。ぜひ今日から使ってみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。