Python学習ガイド

文法、フレームワーク、パッケージ — コードレベルで動作原理整理

📖 文法・基礎

🔄

Generatorとyield — メモリを食わないイテレーションの原理

yieldが関数実行を「一時停止」させるメカニズム

Generatorは値を一度に作らずyieldで1つずつ送り出す。10GBファイルを1行ずつ処理できる理由がこれ。内部的に関数のスタックフレームを保存しながら実行を中断/再開する。

🎀

デコレータ内部構造 — @が実際にやること

関数を受け取って関数を返す関数 — それが全て

@decoratorはシンタクティックシュガー。func = decorator(func)と同一。クロージャと*args/**kwargsの組み合わせで元関数をラップするパターン。

🚪

コンテキストマネージャ — with文が実際にやること

__enter__と__exit__でリソースクリーンアップを保証するプロトコル

withは__enter__()でリソースを取得し、ブロック終了時(エラーの有無問わず)__exit__()でクリーンアップ。contextlib.contextmanagerでgeneratorベース実装も可能。

🏷️

Type Hints — ランタイムでは何もしない

Pythonの型ヒントが「ヒント」である理由と、Pydanticがこれを克服する方法

Pythonの型ヒント(: int, -> str)はランタイムで検査されない。mypyのような静的解析ツールが読むだけ。Pydanticはこの限界を__init_subclass__とモデル検証で超えてランタイム型検査を実装する。

✳️

Keyword-only引数 — `*,`が何で、なぜ使うか

`def f(a, b, *, c)`のあのアスタリスク

Pythonの`*,`は「ここから先はキーワードでのみ受け取る」という区切り線。位置引数で渡すとTypeError。呼び出し意図を明確にし、シグネチャ変更に強くする。Rubyにはこの文法がない — Rubyのキーワード引数(`name:`)は最初からkeyword-onlyだから。