为什么Pydantic不会验证字段赋值?

6
我想使用Pydantic来验证我的对象中的字段,但似乎只有在创建实例时才进行验证,而不是在稍后修改字段时进行验证。
from pydantic import BaseModel, validator

class MyStuff(BaseModel):
    name: str

    @validator("name")
    def ascii(cls, v):
        assert v.isalpha() and v.isascii(), "must be ASCII letters only"
        return v

# ms = MyStuff(name = "me@example.com")   # fails as expected
ms = MyStuff(name = "me")
ms.name = "me@example.com"
print(ms.name)   # prints me@example.com

在上述示例中,当我在创建 MyStuff 时传递无效值时,Pydantic会如预期的那样发出警告。
但是,当我之后修改该字段时,Pydantic不会发出警告。这是正常的吗?或者,我如何让 Pydantic 在分配字段时也运行验证器?
1个回答

13

这是默认行为。要在字段赋值时启用验证,请在模型配置中设置validate_assignment为true:

class MyStuff(BaseModel):
    name: str

    @validator("name")
    def ascii(cls, v):
        assert v.isalpha() and v.isascii(), "must be ASCII letters only"
        return v

    class Config:
        validate_assignment = True

设置 validate_assignment = True 有什么缺点吗?我想知道为什么默认值是 False - Antonio Romero Oca
1
@AntonioRomeroOca 我认为这是因为每次更改时运行验证的开销太大。 - winwin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接