Skip to main content

Pydantic Validator

· One min read
Michael

Pydantic 四種 Validator 的差異與範例

import typing as t

from pydantic import BaseModel

from pydantic import AfterValidator
from pydantic import BeforeValidator
from pydantic import PlainValidator
from pydantic import WrapValidator


def plus_1(v: int) -> int:
return v + 1


def subtract_1_and_multiply_by_10(v: int, handler: t.Callable[[int], int]) -> int:
v -= 1
v = handler(v)
v *= 10
return v


def print_int(v: int) -> int:
print(f"{v=}")
return v


PrintInt = t.Annotated[int, PlainValidator(print_int)]


class Model(BaseModel):
after: t.Annotated[PrintInt, AfterValidator(plus_1)]
before: t.Annotated[PrintInt, BeforeValidator(plus_1)]
plain: t.Annotated[PrintInt, PlainValidator(plus_1)]
wrap: t.Annotated[PrintInt, WrapValidator(subtract_1_and_multiply_by_10)]


m = Model(
after=10, # > v=10 (AfterValidator)
before=30, # > v=31 (BeforeValidator)
plain=50, # replace original (PlainValidator)
wrap=70, # > v=69 (WrapValidator)
)


print(m)
# > after=11 before=31 plain=51 wrap=690