Pydantic: 基本的な使用方法
はじめに
Pydanticは私が一番好きなPythonのパッケージです。 イメージとしては、builtinの dataclasses に実行時バリデーションを追加したものです。
「型は飾り」のPythonにおいて、実行時においても型に守られるのはとても嬉しいです。 データの型変換とバリデーションが同時に行われる他、デフォルト値の補完もpydanticに任せることができます。 そのため外界とのインターフェイスにpydanticを置くことで、安心してデータを扱うことができます。
現在は FastAPI や Strawberry などと統合され、人気パッケージとなっています。
サンプルコードは conao3-playground/python-pydantic-blog にあります。
基本的な使用方法
モデルの定義
まずは基本的なモデルの定義から見ていきます。
pydantic.BaseModel を継承してモデルを定義します。
class User(pydantic.BaseModel): user_cd: str name: str age: int = 20初期値を与えることで、デフォルト値を設定することができます。 初期値がないフィールドは必須フィールドとなります。
user1 = User(user_cd='u_001', name='Alice')user2 = User(user_cd='u_002', name='Bob', age=30)
print(user1)print(user2)user_cd='u_001' name='Alice' age=20user_cd='u_002' name='Bob' age=30pydantic.BaseModel を継承することで、キーワードでの初期化が可能になり、print関数の出力も見やすいフォーマッタが用意されます。
pydanticオブジェクトの生成
pydantic.BaseModel を継承したモデルのインスタンスを便宜上「pydanticオブジェクト」と呼ぶことにします。
pydanticオブジェクトは複数の方法で生成することができます。
キーワード引数での初期化
基本の使い方で見た通り、キーワード引数で初期化することができます。
user1 = User(user_cd='u_001', name='Alice')print(user1)user_cd='u_001' name='Alice' age=20dictからの初期化
dictを持っている場合、そのdictからpydanticオブジェクトを生成することができます。
user1_dct = {'user_cd': 'u_001', 'name': 'Alice'}user1 = User.parse_obj(user1_dct)print(user1)また、dictは ** 演算子でキーワード引数に展開できるため、以下のようにも書くことができます。
user1_dct = {'user_cd': 'u_001', 'name': 'Alice'}user1 = User(**user1_dct)print(user1)parse_obj(obj: Any) は引数を dict(args: Iterable) で変換してから ** 演算子で展開しています。
そのため、実際にはdict以外のオブジェクトを渡すこともできます。
user1_data = [('user_cd', 'u_001'), ('name', 'Alice')]user1 = User.parse_obj(user1_data)print(user1)JSONからの初期化
JSON文字列を持っている場合、そのJSON文字列からpydanticオブジェクトを生成することができます。
user1_json = '{"user_cd": "u_001", "name": "Alice"}'user1 = User.parse_raw(user1_json)print(user1)pydanticオブジェクトから取り出し
フィールド名での取り出し
pydanticオブジェクトからフィールド名で取り出すことができます。
user1 = User(user_cd='u_001', name='Alice')print(user1.user_cd)print(user1.name)print(user1.age)u_001Alice20dictへの変換
pydanticオブジェクトは dict() 関数でdictに変換することができます。
user1 = User(user_cd='u_001', name='Alice')print(type(user1.dict()))print(user1.dict())<class 'dict'>{'user_cd': 'u_001', 'name': 'Alice', 'age': 20}jsonへの変換
pydanticオブジェクトは json() 関数でjsonに変換することができます。
user1 = User(user_cd='u_001', name='Alice')print(type(user1.json()))print(user1.json())<class 'str'>{"user_cd": "u_001", "name": "Alice", "age": 20}まとめ
この記事はほとんど dataclasses と同じことをしているだけになってしまいましたが、
次回はバリデーションの話をします。