in pydantic.main.BaseModel.__init__pydantic.error_wrappers.ValidationError: 1 validation error for

pydantic 参数校验错误,函数中使用了pydantic 进行参数校验,使用的类如下

import pydantic
from pydantic import BaseModel
from typing import List, Any, Optional

class RobotMessage(BaseModel):
    code: int = pydantic.Field(200, description="HTTP status code")
    msg: str = pydantic.Field("success", description="HTTP status message")
    question: str = pydantic.Field(..., description="Question text")
    response: str = pydantic.Field(..., description="Response text")
    source_documents: List[str] = pydantic.Field(
        ..., description="List of source documents"
    )

    class Config:
        schema_extra = {
            "example": {
                "code": 200,
                "msg": "success",
                "question": "工伤保险如何办理?",
                "response": "根据已知信息,可以总结如下:\n\n1. 参保单位为员工缴纳工伤保险费,以保障员工在发生工伤时能够获得相应的待遇。",
                "source_documents": [
                    "出处 [1] 广州市单位从业的特定人员参加工伤保险办事指引.docx:\n\n\t( 一)  从业单位  (组织)  按“自愿参保”原则,  为未建 立劳动关系的特定从业人员单项参加工伤保险 、缴纳工伤保 险费。",
                    "出处 [2] ...",
                    "出处 [3] ...",]
              
            }
        }
可以看出来使用FastAPI开启的接口,返回的消息类型是RobotMessage消息,但是这个类的构造的时候要小心,因为有参数校验

r1=RobotMessage(
            code="200",
            msg="查询成功",
            question="你是谁",
            response="我是小助手",
            source_documents=["我是小助手"]
        )

这样构造都符合要求,所以这样构造没有错误

r2=RobotMessage(
            code="500",
            msg="查询失败",
            question="你是谁",
            response="",
            source_documents=[[]]
        )

但是如r2构造就会报错,  File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for RobotMessage
source_documents -> 0
  str type expected (type=type_error.str)

上面的意思RobotMessage类的参数source_documents的0元素期待str类型的元素,但实际元素为列表元素[],即第一个元素的类型不是str,而是列表,所以报错,将最后一行参数改为source_documents=[]就没有问题了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Enum.Enum是Python内置的枚举类,它可以用来定义一组有固定值的常量,可以用来表示一类具有固定特征的对象。而PydanticBaseModel是一种数据模型,可以用来描述一组数据,并且可以指定每个字段的数据类型和范围,以及每个字段是否是必需的。 ### 回答2: Python的enum.Enum和pydanticBaseModel在用法上有一些区别。 首先,enum.Enum是Python中的枚举类,它可以定义一组具名的常量,常用于表示一些固定的选项或状态。我们可以通过继承enum.Enum类来创建一个枚举类,然后在其中定义枚举常量。使用时,可以通过枚举常量的名称来访问它们的值。枚举类还提供了一些方法来操作和比较枚举常量。它主要用于定义一些静态的选项集合,不涉及数据验证和模型的创建。 而pydanticBaseModel是一种用于数据验证和模型定义的工具。通过继承BaseModel类,我们可以定义一个数据模型,其中可以定义各个字段的类型、验证规则和默认值。当我们使用这个模型创建实例时,pydantic会自动验证传入的数据是否符合模型的要求。如果数据验证成功,它将将原始数据转换为指定的类型,如果验证失败,则会引发异常。同时,pydantic还提供了对数据模型的序列化、反序列化和模型的嵌套支持,使得我们能够方便地进行数据操作和交互。 因此,enum.Enum主要用于固定选项的定义和访问,而pydanticBaseModel则更适用于数据验证和模型定义。它们有不同的目的和用法,但可以在一些场景中共同使用。例如,在使用pydantic定义数据模型时,可以使用enum.Enum的枚举类作为字段的类型,来限制允许的取值范围。这样可以在保证数据的有效性的同时,充分发挥两者的优势。 ### 回答3: 在使用上,`enum.Enum` 是 Python 标准库中的枚举类,而 `pydantic.BaseModel` 是一个用于数据验证和序列化的模型基类。 首先,区别之一是它们的作用不同。`enum.Enum` 用于定义枚举类型,通过枚举成员来限定变量的取值范围,使代码更加清晰和可读。`pydantic.BaseModel` 则用于定义数据模型,根据定义的模型中的字段和类型进行数据验证和序列化。 另一个区别是它们使用的方式不同。用 `enum.Enum` 定义的枚举类型可以直接使用枚举成员进行取值,比如 `Color.RED`。而 `pydantic.BaseModel` 需要实例化成对象使用,并且还可以使用对象的字段进行取值和赋值。 此外,`pydantic.BaseModel` 还具有一些额外的特性。例如,它支持使用注解来定义字段的类型,还可以进行数据验证和处理,默认值设置,数据序列化、反序列化等。这些特性使得 `pydantic.BaseModel` 在数据验证和处理方面更加灵活和强大。 总体来说,`enum.Enum` 和 `pydantic.BaseModel` 的用法和作用有一些差异,选择使用哪个取决于具体的需求。如果只需要定义一些枚举类型来约束变量取值范围,`enum.Enum` 就足够了;如果还需要进行数据验证和处理,那么 `pydantic.BaseModel` 是更好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值