Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
Search
MIKIO KUBO
July 03, 2025
Programming
570
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Python型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方
Python型ヒント完全ガイド
初心者でも分かる、現代的で実践的な使い方
MIKIO KUBO
July 03, 2025
More Decks by MIKIO KUBO
See All by MIKIO KUBO
人工知能の歴史: チューリングからエージェントスキルに至る道程}
mickey_kubo
0
100
AlgorithAlgorihms for Decision Making
mickey_kubo
0
130
エージェントスキル:自律型AIが変える最適化とサプライチェーンの未来
mickey_kubo
0
180
エージェントスキルによる最適化
mickey_kubo
2
210
Agent Skills 完全ガイド
mickey_kubo
0
190
Skill Creatorの技術設計と動作原理
mickey_kubo
0
170
AI+SCM
mickey_kubo
0
98
エージェンティック・サプライチェーン」の概念と、製造業におけるその革新的な役割について解説
mickey_kubo
0
110
MOAI Solutionの紹介 -電力最適化を中心として-
mickey_kubo
0
130
Other Decks in Programming
See All in Programming
源内ハンズオン概要編
hideg
0
200
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
710
Go 1.27 における memory allocation の高速化
andpad
0
270
AIと壁打ちしながら進めるコスト管理
fufuhu
0
900
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
160
yield再入門 #phpcon
o0h
PRO
0
1.2k
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.4k
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
130
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
280
Jindong: Introducing Declarative Haptics in Compose Multiplatform
l2hyunwoo
0
120
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.9k
Dockerfile CMD for Node.js
grazie1999
0
110
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
Unsuck your backbone
ammeep
672
58k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
500
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
350
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
660
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
470
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
WCS-LA-2024
lcolladotor
0
800
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
A Tale of Four Properties
chriscoyier
163
24k
Designing Powerful Visuals for Engaging Learning
tmiket
1
500
Transcript
Python 型ヒント完全ガイド 初心者でも分かる、現代的で実践的な使い方 1
1. 型ヒントの「なぜ」 Python の動的型付け:諸刃の剣 Pythonは 動的型付け言語です。 利点: 柔軟で、素早くコードが書ける。 欠点: 大規模になると、予期せぬ型のエラーが実行時までわからない。
def add_numbers(a, b): return a + b print(add_numbers(5, 10)) # -> 15 (OK) print(add_numbers("a", "b")) # -> "ab" (OK?) # 実行して初めてエラーが発覚! # print(add_numbers(5, "hello")) # TypeError: unsupported operand type(s) 2
型ヒントがもたらす3 つの価値 型ヒントは、コードの品質と保守性を向上させる 三本柱を提供します。 1. 可読性とドキュメント化 関数の意図(どんなデータを期待し、何を返すか)が一目瞭然に。 2. 信頼性とエラー検出 プログラム実行
前に、静的解析ツールでバグを発見できる。 3. 開発体験の向上 IDEやエディタが、より正確な自動補完やエラー表示を提供。 3
黄金律:ヒントは「命令」ではない 超重要: Pythonインタプリタ自体は、型ヒントを 完全に無視します。 型ヒントは、あくまで開発者と「静的型チェッカー」のための ヒントです。 ランタイムの動作を強制するものではありません。 # 型チェッカーはエラーを出すが、Pythonは実行できる age:
int = "thirty" print(f"年齢は {age} です。型は {type(age)} です。") # 出力: 年齢は thirty です。型は <class 'str'> です。 型ヒントの真価は、 静的型チェッカーと連携することで発揮されます。 4
2. 型チェッカーとの出会い:mypy 型ヒントを実用的なものにするには、静的型チェッカーが不可欠です。 静的型チェッカーとは? プログラムを 実行せずにソースコードを解析し、型に関するエラーを検出するツール。 mypy は、Pythonの型チェッカーとして最も広く使われているデファクトスタンダードです。 5
mypy のインストールと準備 プロジェクトごとに仮想環境を作成し、その中で mypy をインストールするのがベストプラクティス です。 # 1. 仮想環境を作成 python
-m venv .venv # 2. 仮想環境を有効化 # Windows: .venv\Scripts\activate # macOS/Linux: source .venv/bin/activate # 3. mypyをインストール pip install mypy 6
mypy を使ってみよう mypy がどのようにエラーを見つけるか見てみましょう。 app.py # app.py def greet(name: str)
-> str: return "Hello, " + name print(greet("World")) print(greet(42)) # ここで型が違う! ターミナルで実行 mypy app.py 7
mypy のフィードバックを理解する mypy は、潜在的なバグを正確に指摘してくれます。 エラーメッセージ app.py:5: error: Argument 1 to
"greet" has incompatible type "int"; expected "str" [arg-type] Found 1 error in 1 file (checked 1 source file) app.py:5 : ファイル名と行番号 Argument 1 to "greet" : greet 関数の第一引数で incompatible type "int" : int 型が渡されているが expected "str" : str 型が期待されていた → コードを実行する前に、問題を発見できました! 8
3. アノテーションの基礎 型を記述するための基本的な構文を学びます。 変数のアノテーション 変数名: 型 = 値 の構文を使います。 #
整数型 (integer) user_id: int = 101 # 文字列型 (string) user_name: str = "Alice" # 浮動小数点数型 (float) temperature: float = 36.5 # ブーリアン型 (boolean) is_active: bool = True 9
関数のアノテーション 引数と戻り値に型を付けます。 def 関数名(引数: 型) -> 戻り値の型: def get_user_summary(user_id: int,
is_premium: bool) -> str: """ ユーザーIDとプレミアム状態から要約文字列を生成する。 """ status = "premium" if is_premium else "standard" return f"User {user_id} is a {status} user." # mypyはこの使い方が正しいかチェックできる summary = get_user_summary(101, True) 10
値を返さない関数:-> None 関数が明示的に値を返さない場合、戻り値の型として None を使います。 (他の言語の void に相当します) def print_report(message:
str) -> None: """ メッセージをコンソールに出力する。 この関数は値を返さない。 """ print(f"REPORT: {message}") result = print_report("System status: OK") print(result) # 出力: None -> None は「この関数は副作用のためにあり、戻り値を使うべきではない」という設計意図を示し ます。 11
4. コレクションの型付け リストや辞書など、複数の値をまとめる型の付け方です。 モダンな方法 (Python 3.9+) list , dict などの組み込み型を直接使えます。
これが現在の標準です。 # 文字列のリスト names: list[str] = ["Alice", "Bob", "Charlie"] # 文字列をキー、整数を値に持つ辞書 user_ages: dict[str, int] = {"Alice": 30, "Bob": 25} # 整数のセット unique_ids: set[int] = {101, 102, 103} 簡潔で直感的なため、新しいコードではこちらを使いましょう。 12
tuple の特殊なケース tuple は2つの使われ方があります。 1. 可変長の同種タプル 全ての要素が同じ型。 # 任意の数の整数を含むタプル scores:
tuple[int, ...] = (95, 88, 100) 2. 固定長の異種タプル 要素ごとに型が異なる「レコード」のような構造。(こちらが一般的) # (ID, 名前, アクティブ状態) を表現 user_record: tuple[int, str, bool] = (101, "Alice", True) 13
コレクション型ヒントの比較表 説明 モダンな構文 (Python 3.9+) 旧来の構文 (Python < 3.9) 整数のリスト
list[int] from typing import List List[int] 辞書(strキー, float値) dict[str, float] from typing import Dict Dict[str, float] 文字列のセット set[str] from typing import Set Set[str] 固定長タプル tuple[str, int] from typing import Tuple Tuple[str, int] 可変長タプル tuple[int, ...] from typing import Tuple Tuple[int, ...] 14
5. None の様々な表現方法 「値が存在しない可能性」を示す方法。これは初心者が混乱しやすいポイントです。 新標準 (Python 3.10+) :| 演算子 |
(Union Operator) を使うのが、最もモダンで推奨される方法です。 # 文字列またはNoneになりうる変数 user_nickname: str | None = None # ユーザーを見つけ、見つかればID(int)を、なければNoneを返す def find_user_id(username: str) -> int | None: if username in user_database: return user_database[username] return None str または None という意図が直接的に表現できて、非常に読みやすいです。 15
過去の方法:Union と Optional | 演算子が導入される前は、 typing モジュールの型が使われていました。 Union str |
None は Union[str, None] と完全に等価です。 from typing import Union user_nickname: Union[str, None] = None Optional ( 注意!) Optional[str] は Union[str, None] のショートカットですが、 名前が誤解を招きやすいです。 誤解: 引数が省略可能(オプショナル) 正解: 値として None を許容するだけ 現在、新しいコードでの Optional の使用は推奨されていません。 16
どの構文を選ぶべきか? 明確な推奨があります。 1. Python 3.10 以降: 常に | 演算子を使いましょう。 str
| None 2. Python 3.9 以前: Union を使うのが最も明確です。 Union[str, None] 3. Optional は?: 古いコードで目にしますが、新規に書くのは避けましょう。 構文 Python バージョン 推奨度 `str None` 3.10+ Union[str, None] 3.6+ 良い (3.10未満の標準) Optional[str] 3.6+ 非推奨 (誤解を招く) 17
6. 型の語彙を増やす より複雑な状況に対応するための高度な型。 「何でもあり」の型:Any Any は、すべての型と互換性があると見なされる特別な型です。 Any を使うとその部分の 型チェックが実質的に無効になります。 型ヒントシステムからの「一時的な避難ハッチ」です。
from typing import Any # mypyはこの関数内の型チェックをほとんど行わない def process_untyped_data(data: Any) -> Any: # dataが辞書である保証はないが、エラーにならない key = data["key"] return key + 5 注意: Any の乱用は型ヒントの利点を損なうため、必要最小限にしましょう。 18
ジェネリック関数を作る:TypeVar 様々な型に対して一貫した動作をするジェネリックな関数を作れます。 from typing import TypeVar, Sequence # 'T'という名前の型変数を宣言 T
= TypeVar('T') # Sequence[T] を受け取り、T を返す関数 def get_first_element(items: Sequence[T]) -> T: return items[0] # mypyは型変数の関係性を理解する first_str = get_first_element(["a", "b"]) # first_str は str 型 first_num = get_first_element([1, 2]) # first_num は int 型 TypeVar は、具体的な型に縛られない、型安全で再利用可能なコードを可能にします。 19
関数を型付けする:Callable 関数を引数として受け取る、または返す高階関数を型付けします。 構文: Callable[[引数1の型, ...], 戻り値の型] from typing import Callable
# op引数は、2つのintを受け取りintを返す関数 def calculator(x: int, y: int, op: Callable[[int, int], int]) -> int: return op(x, y) def add(a: int, b: int) -> int: return a + b # `add`関数が指定のCallableと一致するかmypyがチェック result = calculator(10, 5, add) # resultはint型 20
7. 実用的なパターン 実際のコードで役立つ、より高度な型付けパターン。 辞書の構造を定義する:TypedDict キーが固定で、値の型が異なる辞書(例: JSONデータ)に「型」を定義します。 from typing import TypedDict
# 'User'という辞書の型を定義 class User(TypedDict): id: int name: str is_active: bool def process_user(user: User) -> None: print(f"Processing user: {user['name'].upper()}") user_data: User = {"id": 101, "name": "Alice", "is_active": True} process_user(user_data) # OK # mypyがエラーを検出 -> error: Missing key "is_active" ... # process_user({"id": 102, "name": "Bob"}) 21
値を特定のものに限定する:Literal 変数が取りうる値を、いくつかの具体的なリテラル値に限定します。 from typing import Literal # align引数は"left", "center", "right"のいずれか
def set_text_alignment(align: Literal["left", "center", "right"]) -> None: # ... pass set_text_alignment("center") # OK # mypyがエラーを検出 -> error: Argument ... has incompatible type # set_text_alignment("top") 文字列や数値による「モード指定」などでタイポを防ぎ、コードを安全にします。 22
読みやすさを向上させる:型エイリアス 複雑な型に別名(エイリアス)を付けて、可読性を向上させます。 # 型エイリアスを使わない場合... 読みにくい def process_data(data: list[dict[str, tuple[int, str]]])
-> None: ... # 型エイリアスを使う UserID = int UserRecord = tuple[UserID, str] UserData = dict[str, UserRecord] UserList = list[UserData] # エイリアスでアノテーションすると、意図が明確に! def process_data_aliased(data: UserList) -> None: ... ドメイン固有のデータ構造を表現する語彙としても役立ちます。 23
8. まとめと今後の道筋 主要コンセプトのレビュー ヒントは実行時に無視される 型ヒントは静的型チェッカーのためのもの。 mypy は不可欠なパートナー 型ヒントの恩恵を最大限に受けるには必須。 モダンな構文を優先する Python
3.10+: | 演算子 Python 3.9+: list , dict などの組み込みジェネリック 段階的に導入できる 既存のコードに少しずつ型ヒントを追加していける。 24
型付けの旅、次のステップへ 1. 自身のプロジェクトに適用する 小さな関数から型ヒントを付けてみよう! 2. スタブファイル ( .pyi ) を探る
型ヒントがない外部ライブラリも、 types-* パッケージで型チェック可能に。(例: pip install types-requests ) 3. 公式ドキュメントを参照する typing モジュールや mypy のドキュメントには、さらに高度な機能が満載です。 25
ご清聴ありがとうございました 型ヒントは、今日のプロフェッショナルなPython開発に不可欠なスキルです。 このガイドが、皆さんのコードをより堅牢で、読みやすく、優れたものにする一助となれば幸いで す。 26