👹
Pydantic で追加のフィールドを禁止する
結論から
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)
"""
この通り、Extra.forbid
により、追加のフィールドを無効化することができ、タイポを抑制できます。APIに無効な入力が与えられた時にエラーが吐けるので便利です。
JSON Schema で言うところの additionalProperty: false
ですね。
プログラムの健全性を保つ上で、通常、設定すべき項目だと思いますが、フィールドが多く、何度も利用するクラスの場合、バリデーションが重くなることがあるので注意です。
参考
(おまけ) バリデーションが重いので実際の実装を見に行く
大量のフィールドが存在するクラスにExtra.forbid
を指定したときに、バリデーションが著しく遅くなったため、そのパフォーマンス低下の原因を調査しました。
ココらへんが遅いことはわかりました。setの生成・処理が遅いのでしょうか。
私はFastAPIの内部でPydanticを使っていました。非同期処理が得意なASGI (Asynchronous Server Gateway Interface、uvloopがCythonで実装されている) による実装で高速化されているFastAPIと比較してpure Pythonによるフィールドチェックがボトルネックになっていたと考えられます。今後Rust実装で、フィールドチェックを高速化するらしいので、それが楽しみです!
(追記) Alpha 版がリリースされました!
Discussion