pydantic的高阶玩法

Python学习之-Pydantic详解 Pydantic 是一个 Python 库,用于数据解析和验证。它主要基于 Python 类型提示来实现数据的校验和设定限制条件。在 Pydantic 中,BaseModel 是一个核心基类,用于创建数据模型。Pydantic 的主要优势在于其结合了灵活性和强大的数据处理能力,同时简化了常规的数据校验任务,让开发人员更专注于业务逻辑的实现。它通常用于快速开发中,特别是在构建API、数据交互和设置管理场景中发挥重要作用。 阅读详情

pydantic是一个Python的数据验证和转换库,它的特点是轻量、快速、可扩展、可配置。笔者常用的用于数据接口schema定义与检查。

具体的基本用法本文不再做过多的介绍,可以参考pydantic官方文档。本文主要是结合实际项目开发中遇到的问题和解题思路,介绍一些pydantic的高阶玩法。

当前现状

在项目中,pydantic的定义是在数据的出口进行规范化,从而使得下游接受方能更快地去解析和清洗这些数据。

from pydantic import BaseModel, Field

# 定义数据模型
class Project(BaseModel):
    url: str = Field(...)
    title: str = Field(...)
    content: str = Field(...)
    company: List[Dict] = Field(default=[])
    industry: str = Field(...)

以上是简单的一个数据模型定义,代码仅为示例,隐去了一些字段和配置。也就是我们必须传输给Project模型对应的数据才可以通过它的数据校验,否则就无法继续向下(可能是发往下游)

这么做一直以来没什么问题,直到本次项目中的接口返回出现了大更新,使得之前的所有代码层做的数据字段映射必须重新对应匹配。

比如之前title字段对应的是title,现在变成了detail-article-title。

这使得我们必须在代码层做诸如:

# project_data均为接口返回的数据,加数据演示

# 之前的代码
project_data = {
    "url": "https://www.baidu.com",
    "title": "百度一下,你就知道",
}
project = Project(
    **project_data
)

# 现在的代码
project_data = {
  "detail": {
      "url": "xxx"
      "article": {
          "title": "项目标题",
      }
  }
}
project = Project(
    url=project_data["detail"]["url"],
    title=project_data["detail"]["article"]["title"],
)


以上代码取值变得复杂,这还没考虑到数据可能存在出错的问题,比如detail字段不存在,这样就会导致KeyError异常。

而且这并不是夸张的举例(因为事实情况更复杂)。

我怎么能容忍这种情况呢?

解决方案

我当然不是想摒弃掉pydantic,而是想找到一种结合它更优雅的方式来解决这个问题。

于是我第一时间想到了jmespath模块,因为它是一个JSON查询语言,可以用来在JSON数据中查找和提取数据。

from jmespath import search
project_data = {
    "detail": {
        "article": {
            "title": "项目标题",
        }
    }
}

title = search("detail.article.title", project_data)
assert title == "项目标题"  # True

# 即使是path不存在,也不会异常,而是返回None
assert search("detail.article.title1", project_data) is None  # True


所以我打算做一个结合pydantic和jmespath的方式来解决这个问题。


class Project(BaseModel):
    url: str = Field(...)
    title: str = Field(...)
    content: str = Field(...)
    company: List[Dict] = Field(default=[])
    industry: str = Field(...)

    @root_validator(pre=True, skip_on_failure=True)
    def data_converter(cls, v):
        return {
            "url": search("detail.id", v),
            "title": search("detail.article.title", v),
            "content": search("detail.article.content", v),
            "company": search("company[*].name", v),
            "industry": search("industry", v)
        }
    
    @validator("url")
    def url_validator(cls, v):
        # 由于这里的v是拿到的ID,需要组合成url
        return f"https://xxxxx/{v}"

从代码中可以知道,我是在root_validator中提前做了数据的转换,将jmespath的查询结果赋值给对应的字段。

但是做完之后我越看越变扭,我为了做这个事情,先要申明所有字段,还要对这些字段一一映射。

于是,我想到了pydantic的Config类,它可以用来配置pydantic的一些行为。而且通过查看源码,我认为我可以通过Field类中输入一个path变量,告诉未来的处理器,这个path是用来做数据提取的。

class Project(BaseModel):
    url: str = Field(..., path="temporaryLibrary.id")
    company_names: str = Field(..., path="company[0].enterprise.name")
    versions: List[str] = Field(..., path="versionList[*].id")

当然现在代码是没有任何意义的,因为path是我们自定义的,pydantic并不知道如何处理它。

所以下一步我们要做的是,如何更好的让pydantic知道如何处理path。

在多次翻阅它源代码,并结合官方文档中对Model类的介绍,我找到了一个可行的方案。

Pydantic models can be created from arbitrary class instances to support models that map to ORM objects.

也就是说,我可以将原始数据通过from_orm传递给pydantic的模型,然后通过Data binding的方式,将数据绑定到模型中。Data binding允许我们自定义数据的取值来源。

class ProjectGetter(GetterDict):

    def get(self, key: str, default: Any) -> Any:  # noqa
        # 由于getter_dict所能拿到的“数据权限”相对较低,
        # 也就是它的权限仅仅是处理数据,而不是处理模型,
        # 所以我们需要自己去拿到模型,然后再去拿到path
        model, data = self._obj['model'], self._obj['data']
        for name, field in model.__fields__.items():
            path = field.field_info.extra.get('path')
            if path and name == key:
                return search(path, data)
        return default

class Project(BaseModel):
    url: str = Field(..., path="detail.id")
    company_names: str = Field(..., path="company[0].enterprise.name")
    versions: List[str] = Field(..., path="versionList[*].id")

    @validator("url")
    def url_validator(cls, v):
        return f"https://www.baidu.com/{v}"

    class Config:
        # 通过orm_mode指定数据的来源
        orm_mode = True
        # 通过getter_dict指定数据的获取方式
        getter_dict = ProjectGetter

project_data = {
    "detail": {
        "id": 1,
        "article": {
            "title": "项目标题",
        }
    },
    "company": [
      {
        "enterprise": {
          "name": "企业名称1"
        }
      },
      {
        "enterprise": {
          "name": "企业名称2"
        }
      }
    ],
    "versionList": [{"id": "1.0"}, {"id": "2.0"}]
}
project = Project.from_orm({"model": Project, "data": project_data})
print(project)
# url='https://www.baidu.com/1' company_names='企业名称1' versions=['1.0', '2.0']

这样我们在业务端,只需要对Field指定其对应数据提取的path,而不需要再去写一堆的validator或者是在数据进入前做一堆的数据转换。

总结

通过这个小例子,我们可以看到,pydantic的灵活性是非常强的,它可以通过Config类来配置一些行为,而且它的Field类也可以通过extra参数来传递一些额外的信息。这大大的提高了我们的对数据的处理能力。笔者也会在后续的文章中,继续分享pydantic的一些使用技巧。

---------------------------END---------------------------

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。


👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
👉 优快云大礼包:gift::[全网最全《Python学习资料》免费赠送:free:!](https://blog.youkuaiyun.com/weixin_68789096/article/details/132275547?spm=1001.2014.3001.5502) (安全链接,放心点击)

若有侵权,请联系删除

FastAPI 开发中数据校验利器 Pydantic 介绍与集成使用 前言当我们在处理一些数据来自系统外部的时候,可能来自 API、终端用户输入或者其他途径,Web 开发中有句话叫做:永远不要相信用户的输入。所以,我们可能需要检查、校验这些数据,将这些数据格式化、标准化,以至于这些数据满足我们真实程序的数据输入,保证项目的正确执行。Pydantic 介绍Pydantic 是一个 Python... 阅读详情

相关推荐

【Python】 Pydantic 库

Pydantic 是一个基于 Python 类型提示 (Type Hints) 进行数据验证、序列化和反序列化、以及设置管理的库。它利用 Python 3.6+ 引入的类型注解,使得开发者能够以声明式的方式定义数据模型,并自动获得强大的数据校验能力和清晰的数据结构。简单来说,你通过编写 Python 类来定义你的数据应该是什么样子(字段、类型、约束等),Pydantic 则负责确保任何输入数据都符合这些定义。如果数据有效,Pydantic 会创建一个包含该数据的模型实例;如果数据无效,它会返回一个易于理解的

宅男很神经 2815

Pydantic:目前最流行的Python数据验证库

在处理来自系统外部的数据,如API、终端用户输入或其他来源时,我们必须牢记开发中的一条基本原则:“永远不要相信用户的输入因此,我们必须对这些数据进行严格的检查和验证,确保它们被适当地格式化和标准化。这样做的目的是为了确保这些数据符合我们的程序所需的输入规范,从而保障项目能够正确且高效地运行。

海哥python的博客 9226

python中pydantic库

不知道大家是否非常羡慕C语言等在进行函数传参时,可以指定数据类型来传参呢?我之前有一篇讲过使用typing来指定数据类型,但是其仅仅是能指定数据类型,只能做一个提醒的作用,那么我们如何来结合typing模块,来写一个可以像Java等语言的指定参数类型呢?这里我推荐pydantic库。首先,在学这个库之前,我们需要去回顾一下typing然后,我们来解释一下我们即将要学的库:其使用 Python 类型注释的数据验证和设置管理。pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误。

一个专注于机器学习基础与实战的技术博客,内容涵盖算法推导、模型实现、数学原理与代码实践。用通俗的语言解析复杂概念,记录学习过程中的思考与总结,适合机器学习爱好者和从业者参考。 3133

python库pydantic简易教程

pydantic 库是 python 中用于数据接口定义检查与设置管理的库。pydantic 在运行时强制执行类型提示,并在数据无效时提供友好的错误。1.与 IDE/linter 完美搭配,不需要学习新的模式,只是使用类型注解定义类的实例2.多用途,BaseSettings 既可以验证请求数据,也可以从环境变量中读取系统设置快速3.可以验证复杂结构4.可扩展,可以使用validator装饰器装饰的模型上的方法来扩展验证。

weixin_43936332的博客 9455

Pydantic模块学习

本文讲解了pydantic库的使用方法: 1. 如何安装 2. 如何验证数据(字段数据和函数形参) 3. 如何序列化和反序列化 4. 如何验证配置数据

Ethan's Blog 964

Python Pydantic 教程

Pydantic 是一个用于数据验证和设置管理的 Python 库,它通过 Python 类型注解来定义数据模型,提供强大的数据验证功能。id: intname: strname: strage: intraise ValueError('必须包含空格')date: date# 控制dict输出print("JSON输出:", record.json(indent=2))print("字典输出:", record.dict())

weixin_45878348的博客 1997

一文带你玩转pydantic的高阶玩法

通过这个小例子,我们可以看到,pydantic的灵活性是非常强的,它可以通过Config类来配置一些行为,而且它的Field类也可以通过extra参数来传递一些额外的信息。这大大的提高了我们的对数据的处理能力。笔者也会在后续的文章中,继续分享pydantic的一些使用技巧。

Saki_Python的博客 1186

【Pydantic】如何在 Pydantic 中实现严格模式校验

Pydantic 支持自定义数据类型,并允许为其定义自己的校验逻辑。自定义数据类型非常适合那些特定领域的严格数据规则。# 正确的用例# 错误的用例model = MyModel(color="123456") # 抛出 ValidationError通过自定义类型,我们可以为HexColor添加非常具体的规则,并确保这些规则在模型校验时生效。Pydantic 是一个强大且灵活的工具,能够帮助开发者快速构建数据模型并进行高效的数据校验。

h1773655323的博客 1504

【超详细】Python——pydantic的高阶玩法

通过这个小例子,我们可以看到,pydantic的灵活性是非常强的,它可以通过Config类来配置一些行为,而且它的Field类也可以通过extra参数来传递一些额外的信息。这大大的提高了我们的对数据的处理能力。笔者也会在后续的文章中,继续分享pydantic的一些使用技巧。

aobulaien001的博客 3893

Pydantic兼容性的指南

LangChain停止对Pydantic 1的支持,并内部迁移至Pydantic 2。由于LangChain内部使用Pydantic v1,继承LangChain模型时应使用Pydantic v1原语。在内部实现上,LangChain通过Pydantic 2的v1命名空间继续使用Pydantic V1。大多数工具使用的LangChain API(见下表)已更新为同时接受Pydantic v1或v2对象。Pydantic v2对象对应安装pydantic 2时的pydantic.BaseModel子类。

wangmengmeng99的博客 875

cvtColor +内存泄漏

题目不知道怎么取,因为cvtColor并没有产生内存泄漏,但是我由于没有正确使用cvtColor而出现了内存泄漏的问题,所以暂且以cvtColor+内存泄漏为题 1.应用背景 项目中用到cvtColor的地方是需要将灰度图转为3通道的彩色图(实际上转换后仍然为灰色的,但是电脑认为的是3通道的彩色图了) 因此需要用到以下语句 cvtColor(src_img, cvMtxRGB, C

smilebluesky的专栏 6056

Pydantic 全面指南:从入门到高级应用

Pydantic 是一个用于数据验证和设置管理的 Python 库。它通过 Python 类型注解来定义数据模型,并提供了强大的数据验证功能。Pydantic 的主要目标是确保数据在输入和输出时的一致性和有效性。它广泛应用于各种 Python 项目中,特别是在需要处理复杂数据结构和确保数据完整性的场景中。数据验证:确保输入数据符合预定义的类型和结构。序列化:将复杂的数据结构转换为 Python 数据类型,便于处理和传输。错误处理:提供详细的错误信息,帮助开发者快速定位和修复问题。配置管理。

全世界的博客 1万+

ESP32S3与ILI9341 LCD屏LVGL移植实战:从零构建嵌入式GUI界面

本文详细介绍了如何在ESP32S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕,从硬件选型、开发环境配置到显示驱动实现和内存优化。通过实战案例讲解移植过程中的关键步骤和常见问题解决方案,帮助开发者快速构建嵌入式GUI界面。

h9j8k7l6m5n的博客 1096

【Python系列】pydantic版本问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 1万+

abb机器人指令手册_ABB机器人配置圆形输送链跟踪

更多内容请点击上方ABB机器人实战技巧关注也可点击公众号下方往期经典浏览更多内容转载请先后台留言,大家一起支持原创,推动机器人使用和发展本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言1. 通常的机器人输送链跟踪,均为直线输送链跟踪,例如下图2. 有些情况,输送链为圆形,例如...

weixin_39849894的博客 2044

Geant4学习一:写一个简单程序

1、 基本介绍

ccwwNUAA的博客 7697

django-pydantic-field:让Django与Pydantic完美融合

django-pydantic-field:让Django与Pydantic完美融合 项目介绍 在现代化的Web开发中,数据验证和序列化是至关重要的环节。Django作为一款流行的Python Web框架,提供了强大的ORM和表单系统。而Pydantic则以其数据验证和设置管理能力著称。django-pydantic-field正是这样一个开源项目,它将Django的JSONField与Pydan...

gitblog_00446的博客 1138

vLLM专题(七)-支持的模型列表

vLLM支持跨多种任务的生成式和池化模型。如果一个模型支持多个任务,您可以通过–task参数来设置任务。对于每个任务,我们列出了已在vLLM中实现的模型架构。每个架构旁边,我们列出了一些使用该架构的流行模型。

1257

Python——pydantic库

Pydantic 是一个用于 Python 的数据验证库,特别适用于构建 RESTful API 服务,尤其是结合 FastAPI 和 Starlette 框架时。它利用 Python 的类型注解系统,可以高效且准确地验证和清理传入应用程序的数据。Pydantic 提供了强类型模式验证,能够确保数据结构一致性和安全性。

pumpkin84514的博客 1369

华为OD机考双机位C卷 - 池化资源共享 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 池化资源共享 (OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 1070

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

时序预测 | MATLAB实现NGM(1,1)多变量灰色时间序列预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 1514

Pydantic的BaseConfig

Pydantic是一个用于数据验证和设置管理的Python库。它可以通过类型注解来自动生成验证和解析逻辑。BaseConfig是Pydantic模型配置的基类,允许用户定制模型的行为和验证规则。可以在配置类中定义自定义验证器来增加验证逻辑。name: strage: int# 创建模型实例# 赋值时验证user.age = 30 # 成功user.age = -5 # 抛出 ValueError: Age must be a positive number。

jixiaoyu0209的博客 2031

把云端打印带回办公室:通信场景 SAP_COM_0466 打通 SAP BTP ABAP environment 与本地打印机的 Pull Integration 实战

摘要: 本文探讨云端SAP系统如何通过SAP_COM_0466通信场景实现与本地打印机的安全连接。核心方案采用Pull Integration模式,由本地组件(如SAP Cloud Print Manager或第三方OMS)主动从云端打印队列拉取任务,避免网络边界冲突。配置流程涵盖通信安排创建、打印队列绑定及权限管理,并强调队列类型必须选择"Pull Integration Queue"的关键细节。方案通过分离云端生产与本地打印环节,既保障安全性又便于运维监控,适用于SAP BTP AB

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 140

FastAPI 从 Pydantic v1 迁移到 Pydantic v2:版本演进与渐进式迁移实战指南

本文围绕 FastAPI 官方文档 [docs/fr/docs/how-to/migrate-from-pydantic-v1-to-pydantic-v2.md](https://link.gitcode.com/i/20ed672e4cf767560c8faff1782031a6)(英文原版见 [docs/en/docs/how-to/migrate-from-pydantic-v1-to-p

gitblog_00485的博客 1058

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Pydantic 数据验证

Pydantic数据验证

Mark_Australia的博客 1112

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 深入了解 Pytest Markers:提升测试用例的组织和控制能力
下一篇: Python内置库:pathlib模块详解
Python_P叔
博客等级 码龄3年 5446粉丝 827原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值