Lab AI Pythonの型ヒントを活用してコード品質を上げる
目次

Pythonは動的型付け言語だが、型ヒント(Type Hints)を使うことで静的解析ツールによるバグ検出、IDEの補完精度向上、コードの可読性改善が得られる。本稿ではmypy・pyrightで使える実践的な型ヒントのパターンを整理する。

基本の型アノテーション

# 変数と関数の基本的な型ヒント
name: str = "Alice"
age: int = 30
score: float = 9.8
is_active: bool = True

def greet(name: str, count: int = 1) -> str:
    return f"Hello, {name}! " * count

# 戻り値なしの場合は None
def log_error(message: str) -> None:
    print(f"ERROR: {message}")

コレクション型

Python 3.9以降はlist[str]のように小文字で書ける。3.8以前はfrom typing import Listが必要。

from typing import Optional, Union

# Python 3.9+
def process_items(items: list[str]) -> dict[str, int]:
    return {item: len(item) for item in items}

# Optional(Noneを許容)
def find_user(user_id: int) -> Optional[str]:
    # None を返す可能性がある
    return None

# Union(複数の型を許容)
def parse_value(value: Union[str, int]) -> float:
    return float(value)

# Python 3.10以降はXでUnionを書ける
def parse_value_new(value: str | int) -> float:
    return float(value)

TypedDictとdataclass

辞書やデータ構造に型を与える2つの方法。

from typing import TypedDict
from dataclasses import dataclass

# TypedDict: 既存のdict互換が必要な場合
class UserData(TypedDict):
    id: int
    name: str
    email: str

def save_user(user: UserData) -> None:
    print(f"Saving: {user['name']}")

# dataclass: より多機能で推奨
@dataclass
class User:
    id: int
    name: str
    email: str
    is_active: bool = True

    def full_info(self) -> str:
        return f"{self.name} <{self.email}>"

Genericとプロトコル

from typing import TypeVar, Generic, Protocol

T = TypeVar('T')

class Stack(Generic[T]):
    def __init__(self) -> None:
        self._items: list[T] = []

    def push(self, item: T) -> None:
        self._items.append(item)

    def pop(self) -> T:
        return self._items.pop()

# Protocol: ダックタイピングの型安全な表現
class Serializable(Protocol):
    def to_json(self) -> str: ...

def send_response(data: Serializable) -> None:
    print(data.to_json())

mypyの設定と実行

# pyproject.toml
[tool.mypy]
strict = true          # 厳格モード(推奨)
python_version = "3.11"
ignore_missing_imports = true
# 実行
mypy src/
mypy --strict src/main.py

# pyrightはVS Code(Pylance)で自動有効、CLIでも使える
pyright src/

strictモードでは--disallow-untyped-defs(型なし関数をエラー)や--no-implicit-optional(Noneを暗黙に許容しない)などが自動的に有効になる。新規プロジェクトはstrictから始めるのが推奨だ。


まとめ

Pythonの型ヒントはstrintなどの基本型から始め、OptionalUnionTypedDictGenericと段階的に適用範囲を広げる。mypyまたはpyrightをCI/CDに組み込み、型エラーをコードレビュー前に検出する仕組みを整えることで、実行時エラーの削減とIDEの補完精度向上が得られる。既存コードへの導入は# type: ignoreコメントで部分的に抑制しながら漸進的に進めるのが現実的だ。

免責事項 — 掲載情報は執筆時点のものです。料金・機能は変更される場合があります。最新情報は各公式サイトをご確認ください。