2023年11月18日土曜日

PydanticV2 で dict から dataclass を生成する方法

PydanticV2 で dict から dataclass を生成する方法

概要

dict -> obj のデシリアライズを Pydantic V2 を使ってやる方法を紹介します
pydantic の dataclass を使います

過去に JSONWizard を使った方法も紹介しています

環境

  • Python 3.10.2
  • pydantic 2.5.1

サンプルコード

from dataclasses import asdict

from pydantic.dataclasses import dataclass


@dataclass
class Profile:
    lang: str
    framework: str


@dataclass
class User:
    id: int
    name: str
    profile: Profile


if __name__ == "__main__":
    # dict -> obj
    user_dict = {
        "id": 1,
        "name": "hawksnowlog",
        "profile": {
            "lang": "python",
            "framework": "flask",
        },
    }
    user = User(**user_dict)
    print(user.id)
    print(user.name)
    print(user.profile.lang)
    print(user.profile.framework)
    # obj -> dict
    print(asdict(user))

ちょっと解説

  • ネストした構造でもいけます
  • Optional など組み合わせれば任意の値もとれます
  • BaseModel ではこの方法は使えません
  • 各種フィールドは Field として定義することはできません

最後に

BaseModel として使えないのが少し残念ですが単純な dict との変換ならこれが一番簡単な方法かなと思います

ただサードパーティを使うので管理などは少し面倒です
本当に簡単な変換なのであれば純正の json モジュールだけでも何とかなります

参考サイト

0 件のコメント:

コメントを投稿