配置
Pydantic的行为可以通过多种配置值进行控制,相关文档详见ConfigDict类。本页将介绍如何为Pydantic支持的类型指定配置。
Pydantic模型的配置¶
在Pydantic模型上,可以通过两种方式指定配置:
-
使用
model_config类属性:from pydantic import BaseModel, ConfigDict, ValidationError class Model(BaseModel): model_config = ConfigDict(str_max_length=5) # (1)! v: str try: m = Model(v='abcdef') except ValidationError as e: print(e) """ 1 validation error for Model v String should have at most 5 characters [type=string_too_long, input_value='abcdef', input_type=str] """- 也可以使用普通字典(例如
{'str_max_length': 5})。
注意
在Pydantic V1中,使用的是
Config类。这仍然支持,但已弃用。 - 也可以使用普通字典(例如
-
使用类参数:
from pydantic import BaseModel class Model(BaseModel, frozen=True): a: str # (1)!- 与
model_config类属性不同, 静态类型检查器会识别frozen参数,因此任何实例修改都会被标记为类型检查错误。
- 与
Pydantic数据类的配置¶
Pydantic数据类也支持配置(详见专用章节)。
from pydantic import ConfigDict, ValidationError
from pydantic.dataclasses import dataclass
@dataclass(config=ConfigDict(str_max_length=10, validate_assignment=True))
class User:
name: str
user = User(name='John Doe')
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]
"""
TypeAdapter的配置¶
类型适配器(使用TypeAdapter类)支持配置,
通过提供config参数。
from pydantic import ConfigDict, TypeAdapter
ta = TypeAdapter(list[str], config=ConfigDict(coerce_numbers_to_str=True))
print(ta.validate_python([1, 2]))
#> ['1', '2']
其他支持类型的配置¶
如果使用标准库数据类或TypedDict类,
可以通过两种方式设置配置:
-
使用
__pydantic_config__类属性:from dataclasses import dataclass from pydantic import ConfigDict @dataclass class User: __pydantic_config__ = ConfigDict(strict=True) id: int name: str = 'John Doe' -
使用
with_config装饰器(这可以避免TypedDict的静态类型检查错误):from typing_extensions import TypedDict from pydantic import ConfigDict, with_config @with_config(ConfigDict(str_to_lower=True)) class Model(TypedDict): x: str
全局更改行为¶
如果想全局更改Pydantic的行为,可以创建一个自定义父类, 并带有自定义配置,因为配置是可继承的:
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'}
如果为子类提供配置,它将与父类配置合并:
from pydantic import BaseModel, ConfigDict
class Parent(BaseModel):
model_config = ConfigDict(extra='allow', str_to_lower=False)
class Model(Parent):
model_config = ConfigDict(str_to_lower=True)
x: str
m = Model(x='FOO', y='bar')
print(m.model_dump())
#> {'x': 'foo', 'y': 'bar'}
print(Model.model_config)
#> {'extra': 'allow', 'str_to_lower': True}
配置传播¶
当使用支持配置的类型作为字段注解时,配置可能不会传播:
-
对于Pydantic模型和数据类,配置不会传播,每个模型都有自己的 “配置边界”:
from pydantic import BaseModel, ConfigDict class User(BaseModel): name: str class Parent(BaseModel): user: User model_config = ConfigDict(str_to_lower=True) print(Parent(user={'name': 'JOHN'})) #> user=User(name='JOHN') -
对于标准库类型(数据类和类型字典),配置会传播,除非 该类型有自己的配置:
from dataclasses import dataclass from pydantic import BaseModel, ConfigDict, with_config @dataclass class UserWithoutConfig: name: str @dataclass @with_config(str_to_lower=False) class UserWithConfig: name: str class Parent(BaseModel): user_1: UserWithoutConfig user_2: UserWithConfig model_config = ConfigDict(str_to_lower=True) print(Parent(user_1={'name': 'JOHN'}, user_2={'name': 'JOHN'})) #> user_1=UserWithoutConfig(name='john') user_2=UserWithConfig(name='JOHN')