14章pydanticによる実行時型チェック
ロバストなコードの主題は、早い段階でエラーを見つけやすくすることだ。複雑なシステムの開発ではどうしてもエラーが発生する。エラーを回避できない。独自データ型を定義すると、矛盾が起きにくい語彙を生み出せる。型アノテーションを使うと、開発中にエラーを検知できるセーフティネットが得られる。これらはどちらもシフトレフトの例と言える。テストあるいは本番稼働中ではなく、もっと早い段階、理想的にはコード開発時にエラーを発見することだ。
しかし、すべてのエラーがコードインスペクションや静的解析だけで発見できるわけではない。実行時しか検出できないエラーがあるのだ。データベース、設定ファイル、ネットワークリクエストなど、プログラム外から提供されるデータを扱う際は常に入力として不正なデータを受け取る危険がある。データを受け取り、パースするコードをロバストにできても、ユーザが不正なデータを渡すのを防げない。
まず考えるのは、大量のバリデーションロジックを用意することだろう。渡されたデータがすべて正しいかどうかをチェックするif
文である。しかし、バリデーションロジックは複雑で膨大になることが多く、一目見ただけでは理解しにくい。バリデーションの範囲が広ければ広いほどこの問題は大きくなる。エラーを発見することが目的ならば、すべてのコードおよびテストを読むに越したことはないが、その目的のためには調べるべきコード量を最小限にする必要がある。読めば読むほどコードの理解が深まる一方、認知負荷も高まりエラーを発見する確率が下がる。
この章ではpydanticライブラリを使ってこの問題を解決する方法を説明する。pydanticでモデル化されたクラスを定義することで可読性を犠牲にせずバリデーションロジックのコード量を削減できる。また、ユーザから渡されたデータのパースが簡単になり、出力されるデータ構造の正しさが保証できる。この章では基本的な例からpydanticで何ができるかをひと通り紹介し、最後に高度な使い方も紹介する。 ...
Get ロバストPython ―クリーンで保守しやすいコードを書く now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.