我试图在pydantic数据模型中添加一个验证,它是递归的。但是,即使检查失败,验证程序也不会引发错误。
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))实际产出:
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预期产出:
ValueError发布于 2022-10-05 15:31:03
啊,我花了一段时间才弄明白。问题在value注释中。这是因为在该类型的联合中有一个未指定的list。如果删除,验证错误将按预期的方式引发:
class Condition(BaseModel):
operation: str
value: Union[List[Condition], Condition, float, int, str]
...原因是,通过添加未指定的list,您基本上是说value被允许为list[Any]。因此,当所有其他试图验证包含错误值的字典的尝试都失败时,它就被视为“原样”,即某些字典。这就是为什么顶层对象上的value只是字典列表,而不是Condition实例的原因。
https://stackoverflow.com/questions/73958015
复制相似问题