首页 > 编程问答 >Pydantic 的基本模型中不需要

Pydantic 的基本模型中不需要

时间:2024-07-25 14:53:44浏览次数:9  
标签:python python-typing pydantic

我尝试从 API 接受数据,然后使用 Pydantic 基本模型验证响应结构。但是,我遇到的情况是,有时某些字段不会包含在响应中,而有时会包含在响应中。问题是,当我尝试验证结构时,Pydantic 开始抱怨这些字段“丢失”,尽管它们有时可能会丢失。我真的不明白如何将一个字段定义为“missible”。文档提到,仅定义为名称和类型的字段被认为是这种方式,但我没有任何运气

这是我想要完成的简单示例

# Response: {a: 1, b: "abc", c: ["a", "b", "c"]}
response: dict = json.loads(request_response)

# Pydantic Base Model
from pydantic import BaseModel
class Model(BaseModel):
   a: int
   b: str
   c: List[str]
   d: float

# Validating 
Model(**response)

# Return: ValidationError - Missing "d" field

如何做我这样做是为了“d”不会导致验证抛出错误?我尝试将“d”切换为 d: Optional[float] d: Optional[float] = 0.0 ,但没有任何效果。

谢谢!


你是对的,在 Pydantic 中,只需要类型提示就可以使字段可选。但是,你遇到的问题与 Pydantic 无关,而是与你如何将 Optional[float] 解释为字段类型有关。

当你在 Pydantic 模型中声明 d: Optional[float] 时,你是在说:

  • d 是可选的: 它可能存在于你的数据中,也可能不存在。
  • 如果 d 存在,它必须是一个 float 它不能是其他类型,也不能是 None

在你的代码中,你在没有 d 键的情况下发送一个字典给你的 Pydantic 模型,这意味着 Pydantic 无法对其进行验证,因为如果它存在,它应该是一个浮点数。

有几种方法可以解决此问题:

  1. 使用 typing.Union 处理潜在的缺失值:
from typing import List, Union

from pydantic import BaseModel

class Model(BaseModel):
    a: int
    b: str
    c: List[str]
    d: Union[float, None] = None

response_1 = {"a": 1, "b": "abc", "c": ["a", "b", "c"]}
response_2 = {"a": 1, "b": "abc", "c": ["a", "b", "c"], "d": 1.23}

print(Model(**response_1)) 
# Output: Model(a=1, b='abc', c=['a', 'b', 'c'], d=None)

print(Model(**response_2))  
# Output: Model(a=1, b='abc', c=['a', 'b', 'c'], d=1.23)

在这里,我们声明 d 可以是 float 类型或 None 。如果未提供,则默认值为 None

  1. 使用 ... 作为字段的类型提示:
from pydantic import BaseModel

class Model(BaseModel):
    a: int
    b: str
    c: list[str]
    d: ...  = None

response_1 = {"a": 1, "b": "abc", "c": ["a", "b", "c"]}
response_2 = {"a": 1, "b": "abc", "c": ["a", "b", "c"], "d": 1.23}

print(Model(**response_1)) 
# Output: Model(a=1, b='abc', c=['a', 'b', 'c'], d=None)

print(Model(**response_2))  
# Output: Model(a=1, b='abc', c=['a', 'b', 'c'], d=1.23)

... 作为类型提示意味着 Pydantic 将接受任何类型的 d ,包括 None ,或者根本不使用它。

这两种解决方案都将按预期工作,并允许你处理 d 字段的可选性。 选择哪种解决方案取决于你的具体需求和偏好。

标签:python,python-typing,pydantic
From: 74854903

相关文章

  • 在 Python 中动态定义文字字符串排列的并集
    我有一个字符串列表:strings=['a','b','c']我想声明列表中所有可能的有序对的Union类型。硬编码,这看起来像:Literal我如何动态定义CustomType=Literal['ab','ac','aa','ba','bb','bc�......
  • 关于 Python 中装饰器缓存的困惑
    我正在使用Python装饰器来实现函数的缓存。我了解缓存结果以提高性能的基本概念,但我正在努力解决如何处理不同的函数参数并确保底层数据更改时缓存更新。我已经实现了一个基本装饰器,它将函数结果存储在基于参数的字典。但是,此方法无法处理函数参数可能具有复杂结构(如嵌套列......
  • Python:__add__ 和 +,浮点数和整数的不同行为
    当将整数值添加到浮点值时,我意识到如果在浮点上调用该方法可以正常工作,例如:__add__但如果在整数上调用则不行:>>>n=2.0>>>m=1>>>n.__add__(m)3.0起初我认为|||只是对>>>m.__add__(n)NotImplemented和__add__类型的实现方式不同(例如f......
  • python中scrapy爬取数据get()与getall()区别
    在使用scrapy进行爬取数据的时候,有些时候需要爬取的是一段文本,或者一个div里面有很多内容,这时候我们就要使用到get()或者getall()来获取数据: get():是获取的满足条件的第一个数据。getall():是获取的满足条件的所有数据。scrapyget()getall()原理在Scrapy中,get(......
  • python—NumPy基础(3)
    文章目录算术函数算术函数的使用算术函数中out参数的使用mod()函数的使用统计函数power()函数的使用median()函数的使用mean()函数的使用函数的使用其他常用函数tile()和repeat()函数的使用roll()函数的使用resize()函数的使用replace()和put()函数的使savetxt()和lo......
  • Python爬虫:代理ip电商数据实战
    引言:数据访问管理引发的烦恼作为一名Python博主,爬虫技能对于获取和分析数据至关重要,经常爬一下,有益身心健康嘛。爬虫技术对很多人来说,不仅仅是一种工具,更像是一种艺术,帮助我们从互联网中,捕捉到有价值的信息。我经常就会用爬虫来爬取一些所需的数据,用来进行数据分析和模型训......
  • python科学计算:加速库numba —— 安装和试用
    安装(anaconda环境下)condainstallnumbaDemo代码:fromnumbaimportjitfromnumpyimportarangeimportnumpyimporttime@jitdefsum2d(arr):M,N=arr.shaperesult=0.0foriinrange(M):forjinrange(N):result+=a......
  • Python - Selenium抓取淘宝直播间评论(可使用无头模式)
    Python-Selenium抓取淘宝直播间评论(可使用无头模式)下面介绍如何使用python中的selenium简单抓取淘宝直播间实时评论。友情提醒,仅供学习交流使用,请勿用于非法用途!一、创建python项目1.在目录下新建main.py和venv虚拟环境:创建虚拟环境:python-mvenvvenv激活虚拟环......
  • 需要帮助来提取此 XML 节点 - Python 中的 Excel 连接字符串
    我有一个Python程序,打开Excel(XLSX)文件,并尝试查找<connection>节点。这是connections.xml文件中的完整XML。<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><connectionsxmlns="http://schemas.op......
  • 【python】Python中采集Prometheus数据,进行数据分析和可视化展示
    ✨✨欢迎大家来到景天科技苑✨✨......