首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归模型的验证即使在失败时也不会引起错误

递归模型的验证即使在失败时也不会引起错误
EN

Stack Overflow用户
提问于 2022-10-05 08:53:56
回答 1查看 84关注 0票数 1

我试图在pydantic数据模型中添加一个验证,它是递归的。但是,即使检查失败,验证程序也不会引发错误。

代码语言:javascript
复制
from __future__ import annotations

from typing import Optional, Union, List

import orjson
from pydantic import BaseModel, validator


def orjson_dumps(v, *, default):
    return orjson.dumps(v, default=default).decode()


class Condition(BaseModel):
    operation: str
    value: Union[List[Condition], Condition, float, int, list, str]
    attribute_name: Optional[str]

    @validator("operation", pre=True, always=True)
    @classmethod
    def validate_operations(cls, field_value):
        if field_value not in ["and", "or", "equal"]:
            msg = f"Supported operations: [and, or, equal]. Passed operation: {field_value}"
            raise ValueError(msg)
        return field_value


if __name__ == '__main__':
    condition4 = {'operation': 'or', 'value': [
        {'operation': 'equal', 'attribute_name': 'num_pay_txns_month', 'value': 6},
        {'operation': 'incorrect_operation', 'attribute_name': 'num_pay_txns_week', 'value': 3}]}
    print(Condition(**condition4))

实际产出:

代码语言:javascript
复制
operation='or' value=[{'operation': 'equal', 'attribute_name': 'num_pay_txns_month', 'value': 6}, {'operation': 'incorrect_operation', 'attribute_name': 'num_pay_txns_week', 'value': 3}] attribute_name=None

预期产出:

代码语言:javascript
复制
ValueError
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-05 15:31:03

啊,我花了一段时间才弄明白。问题在value注释中。这是因为在该类型的联合中有一个未指定的list。如果删除,验证错误将按预期的方式引发:

代码语言:javascript
复制
class Condition(BaseModel):
    operation: str
    value: Union[List[Condition], Condition, float, int, str]
    ...

原因是,通过添加未指定的list,您基本上是说value被允许为list[Any]。因此,当所有其他试图验证包含错误值的字典的尝试都失败时,它就被视为“原样”,即某些字典。这就是为什么顶层对象上的value只是字典列表,而不是Condition实例的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73958015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档