検証エラー
Pydantic は、有用な検証エラーを提供しようとします。以下は、pydantic を使用するときにユーザーが遭遇する可能性のある一般的な検証エラーの詳細と、それらを修正する方法に関するいくつかの提案です。
引数の種類¶
このエラーは、検証中に関数に引数として渡されるオブジェクトがtuple 、 list 、またはdictではない場合に発生します。 NamedTuple実装で関数呼び出しを使用するため、これがこのエラーを生成する 1 つの方法です。
from typing import NamedTuple
from pydantic import BaseModel, ValidationError
class MyNamedTuple(NamedTuple):
x: int
class MyModel(BaseModel):
field: MyNamedTuple
try:
MyModel.model_validate({'field': 'invalid'})
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'arguments_type'
アサーションエラー¶
このエラーは、検証中に失敗したassertステートメントが検出された場合に発生します。
from pydantic import BaseModel, ValidationError, field_validator
class Model(BaseModel):
x: int
@field_validator('x')
@classmethod
def force_x_positive(cls, v):
assert v > 0
return v
try:
Model(x=-1)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'assertion_error'
bool_parsing¶
このエラーは、入力値がブール値への強制に無効な文字列である場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: bool
Model(x='true') # OK
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'bool_parsing'
bool_type¶
このエラーは、入力値の型がboolフィールドに対して無効な場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: bool
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'bool_type'
このエラーは、入力値がboolのインスタンスではない場合、厳密なフィールドでも発生します。
bytes_too_long¶
このエラーは、 bytes値の長さがフィールドのmax_length制約より大きい場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: bytes = Field(max_length=3)
try:
Model(x=b'test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'bytes_too_long'
バイトが短すぎる¶
このエラーは、 bytes値の長さがフィールドのmin_length制約より小さい場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: bytes = Field(min_length=3)
try:
Model(x=b't')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'bytes_too_short'
バイトタイプ¶
このエラーは、入力値の型がbytesフィールドに対して無効な場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: bytes
try:
Model(x=123)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'bytes_type'
このエラーは、入力値がbytesのインスタンスではない場合、厳密なフィールドでも発生します。
呼び出し可能なタイプ¶
このエラーは、入力値がCallableとして無効な場合に発生します。
from typing import Any, Callable
from pydantic import BaseModel, ImportString, ValidationError
class Model(BaseModel):
x: ImportString[Callable[[Any], Any]]
Model(x='math:cos') # OK
try:
Model(x='os.path')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'callable_type'
dataclass_exact_type¶
このエラーは、 strict=Trueでデータクラスを検証し、入力がデータクラスのインスタンスではない場合に発生します。
import pydantic.dataclasses
from pydantic import TypeAdapter, ValidationError
@pydantic.dataclasses.dataclass
class MyDataclass:
x: str
adapter = TypeAdapter(MyDataclass)
print(adapter.validate_python(MyDataclass(x='test'), strict=True))
#> MyDataclass(x='test')
print(adapter.validate_python({'x': 'test'}))
#> MyDataclass(x='test')
try:
adapter.validate_python({'x': 'test'}, strict=True)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'dataclass_exact_type'
dataclass_type¶
このエラーは、入力値がdataclassフィールドに対して無効な場合に発生します。
from pydantic import ValidationError, dataclasses
@dataclasses.dataclass
class Inner:
x: int
@dataclasses.dataclass
class Outer:
y: Inner
Outer(y=Inner(x=1)) # OK
try:
Outer(y=1)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'dataclass_type'
date_from_datetime_inexact¶
このエラーは、 dateフィールドに指定された入力datetime値にゼロ以外の時間コンポーネントが含まれている場合に発生します。タイムスタンプをdate型のフィールドに解析するには、時間コンポーネントがすべて 0 である必要があります。
from datetime import date, datetime
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: date
Model(x='2023-01-01') # OK
Model(x=datetime(2023, 1, 1)) # OK
try:
Model(x=datetime(2023, 1, 1, 12))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'date_from_datetime_inexact'
date_from_datetime_parsing¶
このエラーは、入力値がdateフィールドとして解析できない文字列である場合に発生します。
from datetime import date
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: date
try:
Model(x='XX1494012000')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'date_from_datetime_parsing'
date_future¶
このエラーは、 FutureDateフィールドに指定された入力値が将来ではない場合に発生します。
from datetime import date
from pydantic import BaseModel, FutureDate, ValidationError
class Model(BaseModel):
x: FutureDate
try:
Model(x=date(2000, 1, 1))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'date_future'
date_parsing¶
このエラーは、入力値がdateフィールドとして解析できない文字列である JSON を検証するときに発生します。
import json
from datetime import date
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: date = Field(strict=True)
try:
Model.model_validate_json(json.dumps({'x': '1'}))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'date_parsing'
date_past¶
このエラーは、 PastDateフィールドに指定された値が過去ではない場合に発生します。
from datetime import date, timedelta
from pydantic import BaseModel, PastDate, ValidationError
class Model(BaseModel):
x: PastDate
try:
Model(x=date.today() + timedelta(1))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'date_past'
date_type¶
このエラーは、入力値の型がdateフィールドに対して無効な場合に発生します。
from datetime import date
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: date
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'date_type'
このエラーは、入力値がdateのインスタンスではない場合、厳密なフィールドでも発生します。
datetime_from_date_parsing¶
!!! note このエラーのサポートと、 yyyy-MM-DD日付からの日時解析のサポートがv2.6.0で追加される予定です。
このエラーは、入力値がdatetimeフィールドとして解析できない文字列である場合に発生します。
from datetime import datetime
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: datetime
try:
# there is no 13th month
Model(x='2023-13-01')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'datetime_from_date_parsing'
datetime_future¶
このエラーは、 FutureDatetimeフィールドに指定された値が将来ではない場合に発生します。
from datetime import datetime
from pydantic import BaseModel, FutureDatetime, ValidationError
class Model(BaseModel):
x: FutureDatetime
try:
Model(x=datetime(2000, 1, 1))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'datetime_future'
datetime_object_invalid¶
このエラーは、 datetimeオブジェクトに関する何かが無効な場合に発生します。
from datetime import datetime, tzinfo
from pydantic import AwareDatetime, BaseModel, ValidationError
class CustomTz(tzinfo):
# utcoffset is not implemented!
def tzname(self, _dt):
return 'CustomTZ'
class Model(BaseModel):
x: AwareDatetime
try:
Model(x=datetime(2023, 1, 1, tzinfo=CustomTz()))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'datetime_object_invalid'
datetime_parsing¶
このエラーは、値がdatetimeフィールドとして解析できない文字列である場合に発生します。
import json
from datetime import datetime
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: datetime = Field(strict=True)
try:
Model.model_validate_json(json.dumps({'x': 'not a datetime'}))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'datetime_parsing'
datetime_past¶
このエラーは、 PastDatetimeフィールドに指定された値が過去ではない場合に発生します。
from datetime import datetime, timedelta
from pydantic import BaseModel, PastDatetime, ValidationError
class Model(BaseModel):
x: PastDatetime
try:
Model(x=datetime.now() + timedelta(100))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'datetime_past'
datetime_type¶
このエラーは、入力値の型がdatetimeフィールドに対して無効な場合に発生します。
from datetime import datetime
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: datetime
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'datetime_type'
このエラーは、入力値がdatetimeのインスタンスではない場合、厳密なフィールドでも発生します。
decimal_max_digits¶
このエラーは、 Decimalに指定された値の桁数が多すぎる場合に発生します。
from decimal import Decimal
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: Decimal = Field(max_digits=3)
try:
Model(x='42.1234')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'decimal_max_digits'
decimal_max_places¶
このエラーは、 Decimalに指定された値の小数点以下の桁数が多すぎる場合に発生します。
from decimal import Decimal
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: Decimal = Field(decimal_places=3)
try:
Model(x='42.1234')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'decimal_max_places'
decimal_parsing¶
このエラーは、 Decimalに指定された値を 10 進数として解析できなかった場合に発生します。
from decimal import Decimal
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: Decimal = Field(decimal_places=3)
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'decimal_parsing'
decimal_type¶
このエラーは、 Decimalに指定された値の型が間違っている場合に発生します。
from decimal import Decimal
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: Decimal = Field(decimal_places=3)
try:
Model(x=[1, 2, 3])
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'decimal_type'
このエラーは、入力値がDecimalのインスタンスではない場合、厳密なフィールドでも発生します。
decimal_whole_digits¶
このエラーは、 Decimalに指定された値の小数点の前の桁数がmax_digits - decimal_placesよりも多い場合に発生します (両方が指定されている場合)。
from decimal import Decimal
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: Decimal = Field(max_digits=6, decimal_places=3)
try:
Model(x='12345.6')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'decimal_whole_digits'
このエラーは、入力値がDecimalのインスタンスではない場合、厳密なフィールドでも発生します。
dict_type¶
このエラーは、入力値の型がdictフィールドのdictはない場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: dict
try:
Model(x=['1', '2'])
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'dict_type'
enum¶
このエラーは、入力値がenumフィールドのメンバーに存在しない場合に発生します。
from enum import Enum
from pydantic import BaseModel, ValidationError
class MyEnum(str, Enum):
option = 'option'
class Model(BaseModel):
x: MyEnum
try:
Model(x='other_option')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'enum'
extra_forbidden¶
このエラーは、入力値に余分なフィールドが含まれている場合に発生しますが、 model_config['extra'] == 'forbid' :
from pydantic import BaseModel, ConfigDict, ValidationError
class Model(BaseModel):
x: str
model_config = ConfigDict(extra='forbid')
try:
Model(x='test', y='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'extra_forbidden'
extra設定の詳細については、追加属性 セクションを参照してください。
finite_number¶
このエラーは、値が無限であるか、検証中に 64 ビット浮動小数点数として表現するには大きすぎる場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: int
try:
Model(x=2.2250738585072011e308)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'finite_number'
float_parsing¶
このエラーは、値がfloatとして解析できない文字列である場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: float
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'float_parsing'
float_type¶
このエラーは、入力値の型がfloatフィールドに対して無効な場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: float
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'float_type'
frozen_field¶
このエラーは、 frozen=Trueのフィールドに値を代入しようとしたり、そのようなフィールドを削除しようとしたときに発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: str = Field('test', frozen=True)
model = Model()
try:
model.x = 'test1'
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'frozen_field'
try:
del model.x
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'frozen_field'
frozen_instance¶
このエラーは、 model_config['frozen] == Trueのときに、いずれかのフィールドを削除するか、新しい値を割り当てようとすると発生します。
from pydantic import BaseModel, ConfigDict, ValidationError
class Model(BaseModel):
x: int
model_config = ConfigDict(frozen=True)
m = Model(x=1)
try:
m.x = 2
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'frozen_instance'
try:
del m.x
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'frozen_instance'
frozen_set_type¶
このエラーは、入力値の型がfrozensetフィールドに対して無効な場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: frozenset
try:
model = Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'frozen_set_type'
get_attribute_error¶
このエラーは次の場合に発生します。 model_config['from_attributes'] == True 属性の読み取り中にエラーが発生します。
from pydantic import BaseModel, ConfigDict, ValidationError
class Foobar:
def __init__(self):
self.x = 1
@property
def y(self):
raise RuntimeError('intentional error')
class Model(BaseModel):
x: int
y: str
model_config = ConfigDict(from_attributes=True)
try:
Model.model_validate(Foobar())
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'get_attribute_error'
greater_than¶
このエラーは、値がフィールドのgt制約を超えない場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: int = Field(gt=10)
try:
Model(x=10)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'greater_than'
greater_than_equal¶
このエラーは、値がフィールドのge制約以上でない場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: int = Field(ge=10)
try:
Model(x=9)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'greater_than_equal'
int_from_float¶
このエラーは、 intフィールドにfloat値を指定すると発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: int
try:
Model(x=0.5)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'int_from_float'
int_parsing¶
このエラーは、値をintとして解析できない場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: int
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'int_parsing'
int_parsing_size¶
このエラーは、Python のstrからintへの解析で許可される最大範囲外の文字列から Python または JSON 値を解析しようとすると発生します。
import json
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: int
# from Python
assert Model(x='1' * 4_300).x == int('1' * 4_300) # OK
too_long = '1' * 4_301
try:
Model(x=too_long)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'int_parsing_size'
# from JSON
try:
Model.model_validate_json(json.dumps({'x': too_long}))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'int_parsing_size'
int_type¶
このエラーは、入力値の型がintフィールドに対して無効な場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: int
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'int_type'
invalid_key¶
このエラーは、 strのインスタンスではないキーを持つdictを検証しようとすると発生します。
from pydantic import BaseModel, ConfigDict, ValidationError
class Model(BaseModel):
x: int
model_config = ConfigDict(extra='allow')
try:
Model.model_validate({'x': 1, b'y': 2})
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'invalid_key'
is_instance_of¶
このエラーは、入力値が予期された型のインスタンスではない場合に発生します。
from pydantic import BaseModel, ConfigDict, ValidationError
class Nested:
x: str
class Model(BaseModel):
y: Nested
model_config = ConfigDict(arbitrary_types_allowed=True)
try:
Model(y='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'is_instance_of'
is_subclass_of¶
このエラーは、入力値が予期された型のサブクラスではない場合に発生します。
from typing import Type
from pydantic import BaseModel, ValidationError
class Nested:
x: str
class Model(BaseModel):
y: Type[Nested]
try:
Model(y='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'is_subclass_of'
iterable_type¶
このエラーは、入力値がIterableとして有効ではない場合に発生します。
from typing import Iterable
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
y: Iterable
try:
Model(y=123)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'iterable_type'
iteration_error¶
このエラーは、反復中にエラーが発生した場合に発生します。
from typing import List
from pydantic import BaseModel, ValidationError
def gen():
yield 1
raise RuntimeError('error')
class Model(BaseModel):
x: List[int]
try:
Model(x=gen())
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'iteration_error'
json_invalid¶
このエラーは、入力値が有効な JSON 文字列ではない場合に発生します。
from pydantic import BaseModel, Json, ValidationError
class Model(BaseModel):
x: Json
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'json_invalid'
json_type¶
このエラーは、入力値が JSON として解析できないタイプの場合に発生します。
from pydantic import BaseModel, Json, ValidationError
class Model(BaseModel):
x: Json
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'json_type'
less_than¶
このエラーは、入力値がフィールドのlt制約以上の場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: int = Field(lt=10)
try:
Model(x=10)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'less_than'
less_than_equal¶
このエラーは、入力値がフィールドのle制約以下でない場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: int = Field(le=10)
try:
Model(x=11)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'less_than_equal'
list_type¶
このエラーは、入力値の型がlistフィールドに対して無効な場合に発生します。
from typing import List
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: List[int]
try:
Model(x=1)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'list_type'
literal_error¶
このエラーは、入力値が予期されるリテラル値のいずれでもない場合に発生します。
from typing_extensions import Literal
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: Literal['a', 'b']
Model(x='a') # OK
try:
Model(x='c')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'literal_error'
mapping_type¶
このエラーは、 .items()などのMappingプロトコルからのメソッドの呼び出しの失敗により検証中に問題が発生した場合に発生します。
from collections.abc import Mapping
from typing import Dict
from pydantic import BaseModel, ValidationError
class BadMapping(Mapping):
def items(self):
raise ValueError()
def __iter__(self):
raise ValueError()
def __getitem__(self, key):
raise ValueError()
def __len__(self):
return 1
class Model(BaseModel):
x: Dict[str, str]
try:
Model(x=BadMapping())
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'mapping_type'
missing¶
このエラーは、入力値に必須フィールドが欠落している場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: str
try:
Model()
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'missing'
missing_argument¶
このエラーは、必須の位置引数またはキーワード引数がvalidate_callで修飾された関数に渡されていない場合に発生します。
from pydantic import ValidationError, validate_call
@validate_call
def foo(a: int):
return a
try:
foo()
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'missing_argument'
missing_keyword_only_argument¶
このエラーは、必須のキーワードのみの引数がvalidate_callで修飾された関数に渡されていない場合に発生します。
from pydantic import ValidationError, validate_call
@validate_call
def foo(*, a: int):
return a
try:
foo()
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'missing_keyword_only_argument'
missing_positional_only_argument¶
このエラーは、必須の位置のみの引数がvalidate_callで修飾された関数に渡されていない場合に発生します。
from pydantic import ValidationError, validate_call
@validate_call
def foo(a: int, /):
return a
try:
foo()
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'missing_positional_only_argument'
model_attributes_type¶
このエラーは、入力値が有効なディクショナリ、モデル インスタンス、またはフィールドを抽出できるインスタンスではない場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
a: int
b: int
# simply validating a dict
print(Model.model_validate({'a': 1, 'b': 2}))
#> a=1 b=2
class CustomObj:
def __init__(self, a, b):
self.a = a
self.b = b
# using from attributes to extract fields from an objects
print(Model.model_validate(CustomObj(3, 4), from_attributes=True))
#> a=3 b=4
try:
Model.model_validate('not an object', from_attributes=True)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'model_attributes_type'
model_type¶
このエラーは、モデルへの入力がモデルまたは辞書のインスタンスではない場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
a: int
b: int
# simply validating a dict
m = Model.model_validate({'a': 1, 'b': 2})
print(m)
#> a=1 b=2
# validating an existing model instance
print(Model.model_validate(m))
#> a=1 b=2
try:
Model.model_validate('not an object')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'model_type'
multiple_argument_values¶
このエラーは、 validate_callで修飾された関数を呼び出すときに 1 つの引数に複数の値を指定すると発生します。
from pydantic import ValidationError, validate_call
@validate_call
def foo(a: int):
return a
try:
foo(1, a=2)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'multiple_argument_values'
multiple_of¶
このエラーは、入力がフィールドのmultiple_of制約の倍数ではない場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: int = Field(multiple_of=5)
try:
Model(x=1)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'multiple_of'
no_such_attribute¶
このエラーは、構成でvalidate_assignment=Trueが設定されており、既存のフィールドではない属性に値を割り当てようとすると発生します。
from pydantic import ConfigDict, ValidationError, dataclasses
@dataclasses.dataclass(config=ConfigDict(validate_assignment=True))
class MyDataclass:
x: int
m = MyDataclass(x=1)
try:
m.y = 10
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'no_such_attribute'
none_required¶
このエラーは、 None必要とするフィールドの入力値がNoneではない場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: None
try:
Model(x=1)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'none_required'
!!! note モデル内でフィールド名とその型の間に名前の衝突がある場合、このエラーが発生することがあります。具体的には、このエラーは、そのフィールドのデフォルト値がNone場合にスローされる可能性があります。
For example, the following would yield the `none_required` validation error since the field `int` is set to a default value of `None` and has the exact same name as its type, which causes problems with validation.
```py
from typing import Optional
from pydantic import BaseModel
class M1(BaseModel):
int: Optional[int] = None
m = M1(int=123) # errors
```
recursion_loop¶
このエラーは、循環参照が検出された場合に発生します。
from typing import List
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: List['Model']
d = {'x': []}
d['x'].append(d)
try:
Model(**d)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'recursion_loop'
set_type¶
このエラーは、値のタイプがsetフィールドに対して無効な場合に発生します。
from typing import Set
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: Set[int]
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'set_type'
string_pattern_mismatch¶
このエラーは、入力値がフィールドのpattern制約と一致しない場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: str = Field(pattern='test')
try:
Model(x='1')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'string_pattern_mismatch'
string_sub_type¶
このエラーは、フィールドが strict で、値がstrの strict サブタイプのインスタンスである場合に発生します。
from enum import Enum
from pydantic import BaseModel, Field, ValidationError
class MyEnum(str, Enum):
foo = 'foo'
class Model(BaseModel):
x: str = Field(strict=True)
try:
Model(x=MyEnum.foo)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'string_sub_type'
string_too_long¶
このエラーは、入力値がフィールドのmax_length制約よりも長い文字列である場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: str = Field(max_length=3)
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'string_too_long'
string_too_short¶
このエラーは、入力値がフィールドのmin_length制約よりも短い文字列である場合に発生します。
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: str = Field(min_length=3)
try:
Model(x='t')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'string_too_short'
string_type¶
このエラーは、入力値の型がstrフィールドに対して無効な場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: str
try:
Model(x=1)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'string_type'
このエラーは、入力値がstrのインスタンスではない場合、厳密なフィールドでも発生します。
string_unicode¶
このエラーは、値を Unicode 文字列として解析できない場合に発生します。
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: str
try:
Model(x=b'\x81')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'string_unicode'
time_delta_parsing¶
このエラーは、入力値がtimedeltaフィールドに対して解析できない文字列である場合に発生します。
from datetime import timedelta
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: timedelta
try:
Model(x='t')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'time_delta_parsing'
time_delta_type¶
このエラーは、入力値の型がtimedeltaフィールドに対して無効な場合に発生します。
from datetime import timedelta
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: timedelta
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'time_delta_type'
このエラーは、入力値がtimedeltaのインスタンスではない場合、厳密なフィールドでも発生します。
time_parsing¶
このエラーは、入力値がtimeフィールドとして解析できない文字列である場合に発生します。
from datetime import time
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: time
try:
Model(x='25:20:30.400')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'time_parsing'
time_type¶
このエラーは、値の型がtimeフィールドに対して無効な場合に発生します。
from datetime import time
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: time
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'time_type'
このエラーは、入力値がtimeのインスタンスではない場合、厳密なフィールドでも発生します。
timezone_aware¶
このエラーは、タイムゾーン対応の日時フィールドに指定されたdatetime値にdatetimeゾーン情報が含まれていない場合に発生します。
from datetime import datetime
from pydantic import AwareDatetime, BaseModel, ValidationError
class Model(BaseModel):
x: AwareDatetime
try:
Model(x=datetime.now())
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'timezone_aware'
timezone_naive¶
このエラーは、タイムゾーンなしのdatetimeフィールドに指定されたdatetime値にタイムゾーン情報がある場合に発生します。
from datetime import datetime, timezone
from pydantic import BaseModel, NaiveDatetime, ValidationError
class Model(BaseModel):
x: NaiveDatetime
try:
Model(x=datetime.now(tz=timezone.utc))
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'timezone_naive'
too_long¶
このエラーは、入力値の長さがフィールドのmax_length制約より大きい場合に発生します。
from typing import List
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: List[int] = Field(max_length=3)
try:
Model(x=[1, 2, 3, 4])
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'too_long'
too_short¶
このエラーは、値の長さがフィールドのmin_length制約より小さい場合に発生します。
from typing import List
from pydantic import BaseModel, Field, ValidationError
class Model(BaseModel):
x: List[int] = Field(min_length=3)
try:
Model(x=[1, 2])
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'too_short'
tuple_type¶
このエラーは、入力値の型がtupleフィールドに対して無効な場合に発生します。
from typing import Tuple
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
x: Tuple[int]
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'tuple_type'
このエラーは、入力値がtupleのインスタンスではない場合、厳密なフィールドでも発生します。
unexpected_keyword_argument¶
このエラーは、 validate_callで修飾された関数を呼び出す際に、位置のみの引数にキーワードで値を指定すると発生します。
from pydantic import ValidationError, validate_call
@validate_call
def foo(a: int, /):
return a
try:
foo(a=2)
except ValidationError as exc:
print(repr(exc.errors()[1]['type']))
#> 'unexpected_keyword_argument'
pydantic.dataclasses およびextra=forbid使用する場合にも発生します。
from pydantic import TypeAdapter, ValidationError
from pydantic.dataclasses import dataclass
@dataclass(config={'extra': 'forbid'})
class Foo:
bar: int
try:
TypeAdapter(Foo).validate_python({'bar': 1, 'foobar': 2})
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'unexpected_keyword_argument'
unexpected_positional_argument¶
このエラーは、 validate_callで修飾された関数を呼び出すときに、キーワードのみの引数に位置の値を指定すると発生します。
from pydantic import ValidationError, validate_call
@validate_call
def foo(*, a: int):
return a
try:
foo(2)
except ValidationError as exc:
print(repr(exc.errors()[1]['type']))
#> 'unexpected_positional_argument'
union_tag_invalid¶
このエラーは、入力の識別子が予期された値の 1 つではない場合に発生します。
from typing import Union
from typing_extensions import Literal
from pydantic import BaseModel, Field, ValidationError
class BlackCat(BaseModel):
pet_type: Literal['blackcat']
class WhiteCat(BaseModel):
pet_type: Literal['whitecat']
class Model(BaseModel):
cat: Union[BlackCat, WhiteCat] = Field(..., discriminator='pet_type')
try:
Model(cat={'pet_type': 'dog'})
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'union_tag_invalid'
union_tag_not_found¶
このエラーは、入力から識別子の値を抽出できない場合に発生します。
from typing import Union
from typing_extensions import Literal
from pydantic import BaseModel, Field, ValidationError
class BlackCat(BaseModel):
pet_type: Literal['blackcat']
class WhiteCat(BaseModel):
pet_type: Literal['whitecat']
class Model(BaseModel):
cat: Union[BlackCat, WhiteCat] = Field(..., discriminator='pet_type')
try:
Model(cat={'name': 'blackcat'})
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'union_tag_not_found'
url_parsing¶
このエラーは、入力値を URL として解析できない場合に発生します。
from pydantic import AnyUrl, BaseModel, ValidationError
class Model(BaseModel):
x: AnyUrl
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'url_parsing'
url_scheme¶
このエラーは、URL スキームがフィールドの URL タイプに対して無効な場合に発生します。
from pydantic import BaseModel, HttpUrl, ValidationError
class Model(BaseModel):
x: HttpUrl
try:
Model(x='ftp://example.com')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'url_scheme'
url_syntax_violation¶
このエラーは、URL 構文が無効な場合に発生します。
from pydantic import BaseModel, Field, HttpUrl, ValidationError
class Model(BaseModel):
x: HttpUrl = Field(strict=True)
try:
Model(x='http:////example.com')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'url_syntax_violation'
url_too_long¶
このエラーは、URL の長さが 2083 を超える場合に発生します。
from pydantic import BaseModel, HttpUrl, ValidationError
class Model(BaseModel):
x: HttpUrl
try:
Model(x='x' * 2084)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'url_too_long'
url_type¶
このエラーは、入力値のタイプが URL フィールドに対して無効な場合に発生します。
from pydantic import BaseModel, HttpUrl, ValidationError
class Model(BaseModel):
x: HttpUrl
try:
Model(x=None)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'url_type'
uuid_parsing¶
このエラーは、入力値の型が UUID フィールドに対して無効な場合に発生します。
from uuid import UUID
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
u: UUID
try:
Model(u='12345678-124-1234-1234-567812345678')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'uuid_parsing'
uuid_type¶
このエラーは、入力値の型が UUID フィールド (str、bytes、または UUID) の有効なインスタンスではない場合に発生します。
from uuid import UUID
from pydantic import BaseModel, ValidationError
class Model(BaseModel):
u: UUID
try:
Model(u=1234567812412341234567812345678)
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'uuid_type'
uuid_version¶
このエラーは、入力値の型が UUID バージョンと一致しない場合に発生します。
from pydantic import UUID5, BaseModel, ValidationError
class Model(BaseModel):
u: UUID5
try:
Model(u='a6cc5730-2261-11ee-9c43-2eb5a363657c')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'uuid_version'
value_error¶
このエラーは、検証中にValueErrorが発生した場合に発生します。
from pydantic import BaseModel, ValidationError, field_validator
class Model(BaseModel):
x: str
@field_validator('x')
@classmethod
def repeat_b(cls, v):
raise ValueError()
try:
Model(x='test')
except ValidationError as exc:
print(repr(exc.errors()[0]['type']))
#> 'value_error'
本文总阅读量次