PythonでPydanticを用いてデータのバリデーションや設定を行う

スポンサーリンク

PythonでPydanticを用いてデータのバリデーションや設定を行ってみます。

バリデーションとはあるデータが要件を満たしているかどうかをチェックするプロセスのことで、不正な入力や想定外の振る舞いを防ぐことができます。

なお、PydanticはPythonの標準ライブラリではないので、事前にインストールする必要があります。また、今回はtypingモジュールも用います。こちらは標準ライブラリですので、事前にインストールする必要はありません。

■Python

Google Colaboratory(Google Colab),2023年3月18日時点ではPython 3.9.16が用いられる。

■Pydanticを用いてデータのバリデーションや設定を行う

では、早速Pydanticを用いてデータのバリデーションや設定を行うため、コードを書いていきます。

■コード

from pydantic import BaseModel
from typing import List

class Item(BaseModel):
  name: str
  price: float
  is_offer: bool = None

class User(BaseModel):
  username: str
  full_name: str = None
  email: str
  items: List[Item] = []

user_data = {
    "username": "test_tanaka",
    "full_name": "TAROUTESE TANAKA",
    "email": "xx0001@example.com",
    "items": [
        {"name": "桃", "price": 198.0},
        {"name": "なし", "price": 198.0, "is_offer": True},
    ],
}

user = User(**user_data)
print(user.dict())

まずは「from import」でpydanticモジュールのBaseModelを呼び出します。その後、Itemというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてBaseModelを渡します。これでBaseModelを継承した形になる。そしてクラス内には「id、price、is_offer」の3つの属性を記述します。各属性には、文字列(str)型なのか、整数(int)型なのか、bool型(True か False どちらか)を指定します。なお、is_offerの場合は「bool = None」と記述し、bool型を格納、そして「=None」でこの変数が初期化されていない場合にデフォルト値としてNone(何も値がないこと)を持つことを指定します。

次にItemというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてBaseModelを渡します。これもBaseModelを継承した形になる。そしてクラス内には「username、full_name、email、items」の3つの属性を記述します。各属性には、文字列(str)型なのか、整数(int)型なのか、bool型(True か False どちらか)を指定します。またitemsの場合は、「List[Item] = []」と記述し、オブジェクトが作成されたときに、最初に保持されるitemsリストは空の状態”[]”に設定します。

設定後、「user_data」という辞書型のデータを定義します。定義する際は、波括弧”{ }”を用い各要素を囲みコロン”:”を使ってキーと値のセットを記述します。

記述後、userという変数を定義し、User()を格納します。これでインスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。括弧内には引数,パラメータとして、”**”演算子を使用しuser_dataのキーを引数,パラメータ名に、その値を引数,パラメータの実際の値にマッピングします。これでデータのバリデーションや設定が行われます。

最後に、userに対してドット演算子( . )を用いてdict()を呼び出し、データを辞書型で取得します。取得された辞書型をprint()で出力してみます。

■実行・検証

このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。

実行してみると、辞書型のデータを辞書型で出力させることができました。なお、今回はPydanticを用いてデータが要件を満たしているかどうかをチェック、設定を行ってみました。

コメント

タイトルとURLをコピーしました