C
Python//Lesson 20

型ヒントの基礎

1時間·theory
Python

型ヒントの基礎

🎯 このlessonを読み終えたら

このlessonを読み終えると、以下の3つを自信を持って行えるようになります。

  • ✅ typing.Optional · Union · Literal · TypedDictの使用
  • ✅ mypy --strictを通過させるパターン
  • ✅ Generic + TypeVarで再利用可能な型

学習目標をチェックリストとして手元に置き、すべて答えられるようになったらlessonを閉じてください。

型ヒント — コード + 実行結果

x: int = 変数・関数への型アノテーション。Python 3.5+(PEP 484)。ランタイムへの影響なし。IDEとmypyが活用します。


1. 関数への型

python
# ❌ 型なし — 何を受け取り、何を返す?
def add(a, b):
    return a + b

# ✅ 型を明示
def add(a: int, b: int) -> int:
    return a + b

print(add(3, 5))    # 8
# add("a", "b")     # mypyが検出するが、*ランタイムでは動作する*

⚠️ Pythonは型ヒントを強制しません。あくまでアノテーションです。mypy・pyrightが静的検査を担います。


2. よく使う型

python
age: int = 28
height: float = 175.5
name: str = "ホン・ギルドン"
is_student: bool = True

scores: list[int] = [85, 92, 78] # 3.9+

person: dict[str, int] = {"name": 1} # 3.9+

coords: tuple[float, float] = (37.5, 127.0)

tag_set: set[str] = {"a", "b"}

code

---

### 3. Optional · Union(Nullableな型)

python

def find(name: str) -> str | None: # 3.10+ — | を使用

return data.get(name)

# 3.9以下では
from typing import Optional
def find(name: str) -> Optional[str]:
return data.get(name)

# Union — 複数の型を許容

def process(x: int | str) -> str: # 3.10+

return str(x)

code

---

### 4. Callable · 複雑な型

python

from typing import Callable

# 関数を受け取る関数
def apply(f: Callable[[int], int], x: int) -> int:
return f(x)

result = apply(lambda n: n * 2, 5) # 10

code

---

### 5. クラス + 型

python

from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int
friends: list["Person"] = None # 前方参照

def greet(p: Person) -> str:

return f"こんにちは {p.name}"

code

---

### 6. 型チェック — mypy

bash

$ pip install mypy

$ mypy my_file.py

# error: Argument 1 to "add" has incompatible type "str"; expected "int"

``


一行まとめ

def f(x: T) -> R: + list[int] + str | None` の3つで90%をカバーできます。

💻 型ヒントの基本
# 変数タイプ ヒント
name: str = "チョルス"
age: int = 25
height: float = 175.5
is_student: bool = True

# 関数タイプ ヒント
def greet(name: str) -> str:
    return f"こんにちは、{name}さん!"

def add(a: int, b: int) -> int:
    return a + b

# 戻り値なし
def print_hello() -> None:
    print("Hello")

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

# Python 3.8 以下
from typing import List, Dict
def process_items_old(items: List[str]) -> Dict[str, int]:
    return {item: len(item) for item in items}

# クラスメソッド
class Person:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age
    
    def greet(self) -> str:
        return f"こんにちは、{self.name}"

💡 重要ポイント

1. 型ヒントはあくまでヒントであり、強制ではありません
2. Python 3.9+: list[str], dict[str, int]
3. Python 3.8以下: from typing import List, Dict

Pythonは簡潔で読みやすい文法が特徴で、幅広い分野で活用されています。インタープリタ言語であるため、REPL環境で即時実行が可能です。PEP 8コーディングスタイルガイドに従い、Black/autopep8で自動フォーマットができます。型ヒント(type hints)によりコードの可読性とIDEサポートが向上します。パッケージ管理はpip、仮想環境はvenv/condaで構築します。

🐍 実際に試してみよう — 型ヒントの基礎

上記の概念を実際にコードとして実行してみてください。値を変えながら動作を自分で確認するのが、最も速い学習方法です。
✏️ Python 코드
📟 コンソール出力
▶ 実行ボタンを押してください
🐍 Pyodideで実際のPythonを実行 — 初回は読み込みに3〜5秒

🤖 AIへのリクエスト例

このlessonの概念を知っていれば、AIに具体的に指示できます。曖昧な「直して」ではなく、語彙を持ったリクエストができる — それがトークン節約の出発点です。

  • 「この関数シグネチャにtyping.Optional · Literal · TypedDictを使って、精密な型付けをしてください」
  • 「このコードがmypy --strictを通過するよう、型を補強してください」

なぜこれがトークンを減らすのか

概念を知らないと、AIの回答を受け取った後に「それは何ですか?」と再度聞かなければなりません。その「再質問」がトークンを消費します。概念を一度習得しておけば、会話が一度で完結します

型ヒント - Python