背景として、私事ですが私は今年プロダクト開発チームから離れて、半分データエンジニア・半分実験開発みたいな仕事をしています。この新しい仕事において、MLやデータ周りのエコシステムが強いPythonをメインに使っています。
本題に戻ると、今回は個人のPydanticモデルの使い方、あるいはPydanticモデルを基本要素にしたライブラリを紹介しようと思います。
Pydanticとは から始めたい方に この記事 をおすすめします。
TypedDict・dataclassの代わりに
私自身は頭悪くてワーキングメモリが小さいため、コード補完やタイプ検査にすごく依存しています。
TypedDictはまだDictであるし、スペルミスや型ミスマッチをガードしてくれない。dataclassはkeyを保証してもvalueは見てくれない。
Pydantic modelにすれば、実行時のタイプ検査が付いてくる。
JSONEncoder JSONDecoderの代わりに
前項の補足ですが、Pydanticモデルを定義すれば、JSONとのシリアライズ・ディシリアライズが自動で付いてきて、複数のPydanticモデルでクラスも自動でネスティングJSONとの相互変換が簡単似できます。
また datatimeのようなよく使うけどJSONにないクラスでも、JSONにシリアライズ・ディシリアライズするデフォルト設定が付いていて、自分で決めなくて良くなります。(ただし他の言語との相互利用がある場合、Pydanticで定義した非JSONフィールドがどうやって解釈するがを確認したほうがいいです)
Relational DB 操作に: SQLModel
SQLModel はsqlalchemy ベースのORM ライブラリです。
モデルをPydantic風に定義すれば、DBローインスタンスをデータクラス感覚で利用できて、。SQLAlchemyベースの他のツール(例えばマイグレーション生成・管理のalembic ) は依然利用できます。
ただし下のsqlalchemyをうまく隠しきれたとは言えなく、sqlalchemyのローレベルAPIをしばしば使わないといけない。代用品というより、タイプ検査を強化した不完全なwrapper と言えるでしょう。
ElasticSearch 操作に: esorm
esorm はPydanticベースのElasticSearch ORMです。
ElasticSearchのより細かなデータ型にPythonのタイプを用意していて、これら使えば Index Mappingが(デフォルト設定で満足すれば)一発でできちゃいます。もちろんESに書き込むもの、ESから読み込んだものが自動でPydanticの検査に通過することで型検査の恩恵を受けられます。
JSONスキーマの生成に
JSON自体はAPI用のシリアライズフォマットとして広く使われていて、ただし言語を跨ぐ限定・検査をできる仕組みというと、個人調査によるとJSON Schema以外サポートがいいものがほぼないです。
PydanticはJSON schemaの生成機能を内蔵していて、JSONEncoderのときのようにネストモデルでも定義すれば、model_json_schema で一発でJSON schemaができちゃいます。これを活用すれば、他のシステムにデータかインタフェースを提供する場合はよりセーフにできるでしょう。
私自身は今年LLMの応用を色々探索していて、OpenAIを始めLLMプロバイダはモデルレスポンスのフォマットを限定する場合、限定方法はほとんどJSON schemaになります。