4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pydantic の使い方5選

Posted at

背景として、私事ですが私は今年プロダクト開発チームから離れて、半分データエンジニア・半分実験開発みたいな仕事をしています。この新しい仕事において、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になります。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?