Pydantic赋值时未触发验证,如何开启赋值验证?
解决Pydantic赋值时未触发字符串类型验证的问题
你遇到的这个问题本质是Pydantic默认的**类型自动转换(coercion)**特性导致的——它会尝试将输入值强制转换为字段声明的类型,而不是直接抛出错误。即使开启了validate_all和validate_assignment,这两个配置只是控制验证的范围和时机,不会关闭默认的类型转换行为。
为什么数字赋值给字符串字段不会报错?
当你给str类型的字段传入int值时,Pydantic会自动将其转换为对应的字符串(比如1234会变成"1234"),所以没有触发验证错误。你可以打印type(person.username)确认一下,实际它已经是str类型了。
两种解决方案实现严格的类型验证
方案1:使用StrictStr类型
Pydantic提供了严格类型(Strict Types),比如StrictStr,它会严格检查输入的类型,不允许任何自动转换。
from pydantic import BaseModel, StrictStr class pyUser(BaseModel): username: StrictStr class Config: validate_all = True validate_assignment = True # 实例化时传入数字会直接触发验证错误 try: person = pyUser(username=1234) except Exception as e: print(e) # 输出类似:1 validation error for pyUser\nusername\n str type expected (type=type_error.str) # 赋值时同样会触发错误 person = pyUser(username="valid_user") try: person.username = 5678 except Exception as e: print(e) # 同上类型错误
方案2:自定义字段验证器
如果你需要更灵活的验证逻辑,可以用@validator装饰器手动实现严格的类型检查:
from pydantic import BaseModel, validator class pyUser(BaseModel): username: str class Config: validate_all = True validate_assignment = True @validator('username') def enforce_strict_string(cls, value): # 仅允许原生字符串类型,拒绝任何类型转换 if not isinstance(value, str): raise ValueError("username must be a native string type, no automatic conversion allowed") return value # 实例化和赋值时都会触发自定义的验证错误 try: person = pyUser(username=1234) except Exception as e: print(e) person = pyUser(username="test_user") try: person.username = 9012 except Exception as e: print(e)
补充说明
validate_all=True:确保所有字段(包括带有默认值的字段)都经过验证,不影响类型转换逻辑。validate_assignment=True:开启属性赋值时的验证,这是你需要的赋值时验证的前提,但同样需要配合严格类型或自定义验证器才能阻止自动转换。
内容的提问来源于stack exchange,提问作者phil0s0pher
相关产品推荐
相关产品推荐

