Traffine I/O

日本語

2023-03-12

Pydanticにおける事前バリデーション

Pydantic Validatorにおけるpre=Trueについて

事前バリデーションは、Pydanticの強力な機能であり、開発者が入力データを標準的なバリデーション手順にかける前に前処理および変更を行うことができます。これは、ユーザー入力や外部ソースからのデータを取り扱う場合に特に有益であり、指定されたデータ型に対してバリデーションされる前に、クリーニング、変換、または再フォーマットが必要な場合があります。

Pydanticモデルにpre=Trueフラグを適用するには、@validatorデコレータのキーワード引数として含める必要があります。以下の例は、これを実現する方法を示しています。

python
from pydantic import BaseModel, validator

class MyModel(BaseModel):
    field: str

    @validator('field', pre=True)
    def clean_field(cls, value):
        # Implement pre-validation logic here
        return value

この例では、MyModelというPydanticモデルが定義され、str型の単一フィールドであるfieldが含まれています。@validatorデコレータがclean_fieldというクラスメソッドに適用され、このメソッドは検証される前に入力データを前処理する責任を持ちます。

@validatorデコレータ内でキーワード引数として渡されるpre=Trueフラグは、標準的なバリデーションの前にclean_fieldメソッドが実行されることを示します。このメソッドでは、入力データをクリーンアップまたは変換するために必要な任意の事前バリデーションロジックを実装できます。例えば、不要な文字を削除したり、データを特定の形式に変換したり、他のデータ操作タスクを実行したりすることができます。前処理が完了したら、変更された値を返します。この値は、標準的なバリデーションプロセスに渡されます。

Pydanticにおけるカスタム事前バリデーション関数の実装

pre=Trueフラグを@validatorデコレータ内で使用することに加えて、Pydanticはカスタム事前バリデーション関数を実装することができ、データ処理能力をさらに向上させることができます。カスタム事前バリデーション関数は、複雑なデータ操作タスクを処理するために特に有用であり、複数のフィールドやモデルで事前バリデーションロジックを再利用する場合にも役立ちます。

カスタム事前バリデーション関数を作成および使用する方法を示すために、以下の例を考えてみます。

python
from pydantic import BaseModel, validator

def strip_whitespace(value: str) -> str:
    return value.strip()

class MyModel(BaseModel):
    field1: str
    field2: str

    @validator('field1', 'field2', pre=True)
    def apply_strip_whitespace(cls, value):
        # Utilize the custom pre-validation function
        return strip_whitespace(value)

この例では、MyModelクラスの外で定義されたstrip_whitespaceというカスタム事前バリデーション関数があります。この関数は、文字列値を入力として受け取り、先頭および末尾の空白を除去した同じ値を返します。

apply_strip_whitespaceクラスメソッドは、MyModelクラス内で@validatorデコレータとpre=Trueフラグが適用されています。このメソッドは、field1field2の両方にstrip_whitespace関数を適用し、標準的なバリデーションが行われる前に前処理を実行する責任を持ちます。

strip_whitespaceのようなカスタム事前バリデーション関数を実装することで、開発者は複数のフィールドやモデルに適用できる再利用可能なデータ操作ロジックを作成できます。このアプローチは、よりクリーンで整理されたコードの維持だけでなく、アプリケーション全体でデータ処理の一貫性と信頼性を促進することにも役立ちます。

参考

https://docs.pydantic.dev/usage/validators/

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!