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
550
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
25
AlgorithAlgorihms for Decision Making
mickey_kubo
0
79
エージェントスキル:自律型AIが変える最適化とサプライチェーンの未来
mickey_kubo
0
140
エージェントスキルによる最適化
mickey_kubo
2
180
Agent Skills 完全ガイド
mickey_kubo
0
130
Skill Creatorの技術設計と動作原理
mickey_kubo
0
100
AI+SCM
mickey_kubo
0
76
エージェンティック・サプライチェーン」の概念と、製造業におけるその革新的な役割について解説
mickey_kubo
0
85
MOAI Solutionの紹介 -電力最適化を中心として-
mickey_kubo
0
97
Other Decks in Programming
See All in Programming
さぁV100、メモリをお食べ・・・
nilpe
0
140
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
170
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
540
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
190
A2UI という光を覗いてみる
satohjohn
1
130
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
ふつうのFeature Flag実践入門
irof
7
3.8k
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
190
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
120
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
7
4.3k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
400
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
190
Designing for Performance
lara
611
70k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
220
Google's AI Overviews - The New Search
badams
0
1k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
610
Balancing Empowerment & Direction
lara
6
1.2k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
Music & Morning Musume
bryan
47
7.2k
We Are The Robots
honzajavorek
0
250
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
570
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