You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:47:43