😸

Pydanticで常にFieldのValidationを行う

2021/06/22に公開約1,700字

Pydantic とは

https://pydantic-docs.helpmanual.io/
Data validation and settings management using python type annotations.

pydantic enforces type hints at runtime, and provides user friendly errors when data is invalid.

Define how data should be in pure, canonical python; validate it with pydantic

Pydanticは、Pythonの型アノテーションを利用し、実行時における型ヒントを提供したり、データのバリデーションエラー設定を簡単に提供してくれるためのライブラリです。

基本的な利用法

これらは割愛。
この記事に備忘録がてら書いておきたいのは
Modelを定義し、インスタンス化した後でもValidationを動作させる方法

デフォルト動作

from pydantic import BaseModel, Field,validator
from typing import Optional

class DemoModel(BaseModel):

    name: int
    addr: int

hoge = DemoModel(name=1, addr=2)
print(hoge)
hoge.name = "str"

実はこれ動作してしまう。

name=1 addr=2

このままでは、ReturnValueの箱を作って置いて
後から順に値を入力して最後に返す。みたいな使い方をしようとしたときに使えない。
後から値を更新する際にもValidationがかかるようにするにはどうするか?

改定案

以下を追加する。

from pydantic import BaseModel, Field,validator
from typing import Optional

class DemoModel(BaseModel):

    name: int
    addr: int

    class Config:
        validate_assignment = True

hoge = DemoModel(name=1, addr=2)
print(hoge)
hoge.name = "str"
---------------------------------------------------------------------------
ValidationError                           Traceback (most recent call last)
<ipython-input-18-07aede28b224> in <module>
     12 hoge = DemoModel(name=1, addr=2)
     13 print(hoge)
---> 14 hoge.name = "str"

/usr/local/lib/python3.8/dist-packages/pydantic/main.cpython-38-x86_64-linux-gnu.so in pydantic.main.BaseModel.__setattr__()

ValidationError: 1 validation error for DemoModel
name
  value is not a valid integer (type=type_error.integer)

このように無事にエラーが出るようになった。

GitHubで編集を提案

Discussion

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