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だから。
⚡ FastAPI
FastAPIアーキテクチャ — Starlette + Pydantic + Uvicornの組み合わせ
FastAPIが「速い」と言う理由の実体
FastAPI自体は「フレームワークの上のフレームワーク」。HTTPはStarletteが、データ検証はPydanticが、ASGIサーバーはUvicornが担当。FastAPIはこれらを型ヒントベースインターフェースで束ねたもの。
FastAPI Depends() — 関数シグニチャでDIする方法
DBセッション、認証、ページネーションを関数引数として注入するパターン
FastAPIのDepends()は関数を引数のデフォルト値に入れると自動的に呼び出し/注入するDIシステム。ネスト可能で、generatorを使えばクリーンアップも保証。
FastAPIのasync/await — defとasync defの違い
async defを使うと速くなる?場合による
FastAPIでdefはスレッドプールで、async defはイベントループで実行。I/O待ちが多ければasyncが有利、CPUバウンドならdefが良い。両方サポートがFastAPIの強み。
🎸 Django
Django ORM内部 — QuerySetがlazyな理由
filter().exclude().order_by()をチェーンしてもSQLが出ない原理
DjangoのQuerySetは評価(evaluate)されるまでSQLを実行しない。filter/exclude/order_byは内部的にSQL条件を積むだけで、list()/for/[0]等でアクセスした時初めてDBにクエリする。
Djangoミドルウェア — リクエスト/レスポンスを包む玉ねぎ構造
MIDDLEWARE設定順序がなぜ重要か、内部でどうチェーンされるか
Djangoのミドルウェアは玉ねぎの皮のように何層にも包む構造。リクエストは外から中へ、レスポンスは中から外へ通過。MIDDLEWAREリストの順序が実行順序を決定。
Django Signals — イベントベースの疎結合
post_save、pre_deleteが内部的にどう動くか
Django SignalはObserverパターンの実装。モデルが保存/削除された時に登録されたreceiver関数を自動呼び出し。便利だが多用するとデバッグが困難に。
📦 よく使うパッケージ
requests内部構造 — requests.get()が実際にやること
Session、PreparedRequest、HTTPAdapter、urllib3までの呼び出しチェーン
requests.get(url)は内部的にSession生成→PreparedRequest組立→HTTPAdapter選択→urllib3.PoolManagerで実際のTCP接続を経る。この階層構造を知ればコネクションプール、タイムアウト、リトライを適切に設定できる。
Pydantic内部 — 型ヒントがランタイム検証になる過程
__annotations__ → Rustコア(pydantic-core)→ 検証実行
Pydantic v2はモデルクラス定義時に__annotations__を読んでRust製pydantic-coreの検証スキーマを生成。__init__で値を入れる時このスキーマで検証が実行される。
Click — Python CLIツールを作る最もクリーンな方法
デコレータベースCLIフレームワークの内部動作
Clickはデコレータ でCLI引数/オプションを定義するフレームワーク。argparseより直感的で、Flask開発者(Armin Ronacher)が作成。@click.command + @click.optionでCLI完成。