Конфигурация
Поведением Pydantic можно управлять с помощью BaseModel.model_config
и в качестве аргумента TypeAdapter
.
!!! note Примечание. До версии 2.0 использовался класс Config
. Это все еще поддерживается, но устарело .
from pydantic import BaseModel, ConfigDict, ValidationError
class Model(BaseModel):
model_config = ConfigDict(str_max_length=10)
v: str
try:
m = Model(v='x' * 20)
except ValidationError as e:
print(e)
"""
1 validation error for Model
v
String should have at most 10 characters [type=string_too_long, input_value='xxxxxxxxxxxxxxxxxxxx', input_type=str]
"""
Кроме того, вы можете указать параметры конфигурации как kwargs класса модели:
from pydantic import BaseModel, ValidationError
class Model(BaseModel, extra='forbid'): # (1)!
a: str
try:
Model(a='spam', b='oh no')
except ValidationError as e:
print(e)
"""
1 validation error for Model
b
Extra inputs are not permitted [type=extra_forbidden, input_value='oh no', input_type=str]
"""
- Дополнительную информацию см. в разделе «Дополнительные атрибуты» .
Аналогично, если вы используете декоратор @dataclass
из Pydantic:
from datetime import datetime
from pydantic import ConfigDict, ValidationError
from pydantic.dataclasses import dataclass
config = ConfigDict(str_max_length=10, validate_assignment=True)
@dataclass(config=config)
class User:
id: int
name: str = 'John Doe'
signup_ts: datetime = None
user = User(id='42', signup_ts='2032-06-21T12:00')
try:
user.name = 'x' * 20
except ValidationError as e:
print(e)
"""
1 validation error for User
name
String should have at most 10 characters [type=string_too_long, input_value='xxxxxxxxxxxxxxxxxxxx', input_type=str]
"""
Конфигурация с dataclass
из стандартной библиотеки или TypedDict
¶
Если вы используете класс dataclass
из стандартной библиотеки или TypedDict
, вместо этого вам следует использовать __pydantic_config__
.
from dataclasses import dataclass
from datetime import datetime
from pydantic import ConfigDict
@dataclass
class User:
__pydantic_config__ = ConfigDict(strict=True)
id: int
name: str = 'John Doe'
signup_ts: datetime = None
В качестве альтернативы можно использовать декоратор with_config
для обеспечения соответствия средствам проверки типов.
from typing_extensions import TypedDict
from pydantic import ConfigDict, with_config
@with_config(ConfigDict(str_to_lower=True))
class Model(TypedDict):
x: str
Измените поведение глобально¶
Если вы хотите изменить поведение Pydantic глобально, вы можете создать свою собственную BaseModel
с помощью пользовательского model_config
поскольку конфигурация унаследована:
from pydantic import BaseModel, ConfigDict
class Parent(BaseModel):
model_config = ConfigDict(extra='allow')
class Model(Parent):
x: str
m = Model(x='foo', y='bar')
print(m.model_dump())
#> {'x': 'foo', 'y': 'bar'}
Если вы добавите model_config
в класс Model
, он объединится с model_config
из Parent
:
from pydantic import BaseModel, ConfigDict
class Parent(BaseModel):
model_config = ConfigDict(extra='allow')
class Model(Parent):
model_config = ConfigDict(str_to_lower=True) # (1)!
x: str
m = Model(x='FOO', y='bar')
print(m.model_dump())
#> {'x': 'foo', 'y': 'bar'}
print(m.model_config)
#> {'extra': 'allow', 'str_to_lower': True}
本文总阅读量次