Python Pydantic `TypeAdapter` 使用默认值验证缺少的属性

问题描述 投票:0回答:1

假设我有:

class Thing(pydantic.BaseModel):
    one: int
    two: str
    three: bool
    
adapter = pydantic.TypeAdapter(dict[str, Thing])

raw_data = {"this": {"one": 1, "two": "zwei"}, "that": {"one": 111, "two": "dos"}}

您可以看到,我想要使用

raw_data
转换(验证)的
adapter
包含两个缺少属性
three
的项目。我希望仍然能够验证这一点,但为缺失的属性
True
提供默认值
three
但是,我不想想在类Thing
的定义中这样做
,因为在我的用例中,这个默认行为不是类
Thing
的固有部分。我不希望此类的用户假设属性
three
始终有默认值;我只想提供一个默认值 这次,仅针对这个特定的
raw_data
,因为我预计 这个特定的
raw_data
由于某种原因会丢失
three
。 (特别是,这个问题看起来很相似,但并没有解决我的问题。)所以,我想要的是这样的:

things_i_want = adapter.validate_python(raw_data, default={"three": True})

或者:

or_this = adapter.validate_python(raw_data, default=pydantic.Default(three=True))

这在 Pydantic 中可能吗?

python pydantic
1个回答
0
投票

我不知道有一种 Pydantic 方法可以在验证时指定默认值。但是,如果您不想修改

Thing
类,您始终可以在私有范围内对其进行子类化吗?

import pydantic


class Thing(pydantic.BaseModel):
    one: int
    two: str
    three: bool


def validate(data: dict[str, dict]):

    class _Thing(Thing):
        three: str = True

    adapter = pydantic.TypeAdapter(dict[str, _Thing])
    adapter.validate_python(data)


raw_data = {"this": {"one": 1, "two": "zwei"}, "that": {"one": 111, "two": "dos"}}
validate(raw_data)
© www.soinside.com 2019 - 2024. All rights reserved.