👹

Pydantic で無効なフィールドを禁止する

2022/04/15に公開約800字

結論から

from pydantic import BaseModel, ValidationError, Extra


class Model(BaseModel, extra=Extra.forbid):
    a: str


try:
    Model(a='spam', b='oh no')
except ValidationError as e:
    print(e)
    """
    1 validation error for Model
    b
      extra fields not permitted (type=value_error.extra)
    """

これにより、追加のフィールドを無効化することができ、タイポを抑制できる。APIに無効な入力が与えられた時にエラーが吐けるので便利。

JSON Schema で言うところの additionalProperty: false

プログラムの健全性を保つ上で、通常、設定すべき項目だと思うが、フィールドが多く、何度も利用するクラスの場合、バリデーションが重くなることがあるので注意。

参考

https://pydantic-docs.helpmanual.io/usage/model_config/

(おまけ) バリデーションが重いので実際の実装を見に行く

https://github.com/samuelcolvin/pydantic/blob/87da9ac23f0917741c0536b474cf13cdbed50dfc/pydantic/main.py#L1030-L1042

ココらへんが遅いことはわかった。setの生成・処理が遅いのだろうか。

私はFastAPIの内部でPydanticを使っていたので、非同期処理に特化してて、何かしらの実装で高速化されているFastAPIと比較してpure Pythonによるフィールドチェックがボトルネックになることはありうる。

Discussion

ログインするとコメントできます