python中的 Pydantic 框架介绍

 Pydantic 框架介绍

Pydantic 是一个用于数据验证和设置管理的 Python 库。它主要通过数据模型类的定义来处理 JSON 数据、解析请求和响应数据,并提供自动化的验证和转换。Pydantic 主要用于处理 Python 类型的安全性和验证,尤其在 FastAPI 等现代 Python Web 框架中得到广泛应用。

Pydantic 提供了一个强大的功能,允许你定义模型并自动进行类型检查、数据验证和错误处理。它的设计理念是 数据校验与数据结构化,使得开发者能够轻松实现 API 输入数据的验证,同时提高代码的可维护性和可读性。

 Pydantic 的核心特性

1. 基于 Python 类型提示(Type Hints)
   - Pydantic 使用 Python 类型提示来定义数据模型。你可以直接通过 Python 的类型注解(如 str, int, float, List[Type] 等)来指定字段的类型。
   - 类型提示会自动与输入数据进行匹配,并进行转换和验证。

2. 数据验证
   - Pydantic 会自动验证输入的数据类型是否与模型中定义的类型匹配。例如,str 类型的字段如果传入了非字符串的数据,Pydantic 会抛出验证错误。
   - 还支持更复杂的验证,如字符串长度、数字范围等。

3. 自动转换
   - Pydantic 支持自动类型转换,例如,如果你传入一个字符串 "123" 给 int 类型字段,它会自动将字符串转换为整数 123。

4. 支持嵌套模型
   - Pydantic 允许你定义嵌套模型。例如,你可以在一个模型中引用另一个模型作为字段,这样可以方便地进行复杂的数据结构化。

5. 支持数据导出
   - Pydantic 模型不仅支持数据验证,还支持模型的序列化与反序列化,自动将模型转为字典格式或者 JSON 格式,这对于 Web 开发尤其重要。

6. 性能优越
   - Pydantic 是基于 Python 的 dataclasses 和 typing 库构建的,它的性能非常优越,能够高效处理数据验证工作。

7. 错误处理
   - 当数据验证失败时,Pydantic 会提供详细的错误信息,帮助开发者定位问题,错误信息通常包括字段名、错误类型以及错误描述。

 示例

以下是一个使用 Pydantic 定义简单数据模型的示例:

python
from pydantic import BaseModel, Field
from typing import Optional

 定义 Pydantic 模型
class User(BaseModel):
    username: str
    email: str
    age: Optional[int] = Field(None, ge=18)   可选字段,且年龄必须大于等于18

 创建模型实例
user_data = {
    "username": "alice",
    "email": "alice@example.com",
    "age": 25
}

 校验数据并创建模型实例
user = User(user_data)

 访问模型字段
print(user.username)   输出: alice
print(user.dict())   输出: {'username': 'alice', 'email': 'alice@example.com', 'age': 25}


 关键组件

1. BaseModel
   - BaseModel 是 Pydantic 中所有模型的基类。通过继承 BaseModel,你可以创建自定义的 Pydantic 数据模型。
   
2. Field
   - Field 是用来定义字段的额外参数的。你可以通过它设置字段的默认值、描述、验证规则等。Field 是一个非常有用的工具,可以用来实现如最小/最大值、长度限制、正则表达式验证等功能。

3. Optional
   - Optional 是一个类型提示,用于指定一个字段可以是 None,也可以是某种类型。这使得该字段成为可选项。

4. 模型的序列化与反序列化
   - model.dict() 可以将模型实例转化为 Python 字典,方便进行 JSON 序列化。
   - model.json() 可以将模型转化为 JSON 字符串。

 使用场景

1. Web 开发:
   - Pydantic 与 FastAPI 配合使用,在 API 的请求体(如 JSON 数据)和响应体中进行自动验证、转换和文档生成。
   
2. 数据处理:
   - 用于处理外部 API 返回的数据,确保数据符合预期格式,并进行必要的转换。

3. 配置文件:
   - Pydantic 也可以用于配置文件的读取与校验,例如从 .env 文件读取配置并验证其格式。

 示例:FastAPI 使用 Pydantic

FastAPI 是基于 Pydantic 的 Web 框架,Pydantic 的模型被用来验证请求和响应数据。以下是 FastAPI 中使用 Pydantic 模型的示例:

python
from fastapi import FastAPI
from pydantic import BaseModel

 定义 Pydantic 数据模型
class User(BaseModel):
    username: str
    email: str
    age: int

 创建 FastAPI 实例
app = FastAPI()

 定义 POST 请求路由
@app.post("/create-user/")
async def create_user(user: User):
    return {"username": user.username, "email": user.email, "age": user.age}


在这个示例中,User 模型用于验证来自客户端的 JSON 请求体数据。如果数据不符合模型定义的要求,FastAPI 会自动返回 422 错误和详细的验证错误信息。

 总结

Pydantic 是一个功能强大的数据验证和管理工具,能够简化 Python 应用中数据的验证、转换和序列化过程。它的核心优势包括:
- 基于 Python 类型提示
- 高效的性能
- 自动验证和转换
- 易于与 FastAPI 等 Web 框架集成

通过使用 Pydantic,开发者可以确保数据的有效性,减少手动验证的工作,并提高代码的可维护性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

桥接模式和组合模式的区别

桥接模式(Bridge Pattern)和组合模式(Composite Pattern)都是结构型设计模式,旨在解决对象结构的复杂性问题,但它们的应用场景和目的有所不同。以下是它们的区别: 1. 定义与目的 桥接模式&…

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面: 主页面: 添加信息: 删除信息: 删除第一行(支持多行删除) 需求分析: 用QT实现一个学生管理信息系统,数据库为MySQL 要求&#xf…

14.数据容器-set集合

特点 无序的,元素不重复,自带去重功能。 可以容纳不同类型的元素数据。 # 定义一个空set my_set {} your_set set() my_set {aa, bb, bb, aa} # {aa, bb} print(my_set) 因为set集合是无序的,所以集合不支持下标索引访问。所以set集合…

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

硬件选型规则

光源选型: 先用型号中带H的,没有的选标准的. 光源和光源控制器的搭配需要确保接口一致。 根据型号表中的最佳工作距离和相机的尺寸。 光源控制器选型: 首先选择海康风格系列光源控制器考虑与光源的接口匹配。功率应该满足接近光源功率。检查是否退市…

【QNX+Android虚拟化方案】135 - QNX侧如何Dump 88Q5152 MIBS报文计数

【QNX+Android虚拟化方案】135 - QNX侧如何Dump 88Q5152 MIBS报文计数 一、读取 88Q5152 MIBS 计数二、读取 88Q5152 WDT 相关寄存器基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Andro…

C#核心(15)继承中的构造函数

前言 我们之前学过构造函数是什么东西,今天的内容也和构造函数紧密相关,一个继承了父亲的子类里面构造函数的规则是什么样的,今天内容很简单,请听我慢慢讲来。 基本概念 特点:当申明一个子类时,先执行父…

TVbox源贡献指南

欢迎各路大佬踊跃提PR,分享爬虫代码。 源码仓库地址 https://github.com/lushunming/AndroidCatVodSpider 快速开始 本工程是一个完整的AndroidStudio工程,请你用AS打开编辑。 工程调试完毕后要需要导出生成jar文件配合软件使用,执行根目…

FastAPI快速入门

文章目录 了解FastAPI程序结构第一步,导入FastAPI第二步,创建一个app实例第三步,编写一个 路径操作装饰器第五步、运行开发服务器uvicorn main:app --reload即可访问api链接。符案例 声明路径参数声明路径参数的类型get请求查询参数请求体如何…

云计算.运维.面试题

1、计算机能直接识别的语言( C )。 A、汇编语言 B、自然语言 C、机器语言 D、高级语言 2、应用软件是指( D )。 A、所有能够使用的软件 B、能被各应用单位共同使用的某种软件 C、所有计算机上都应使用的基本软件D、专门为某一应用目的而编制的软件 3、计算机的显示器是一…

如何优雅地实现单例模式?内部静态类还是双重检查锁定?

在最近的一个项目中,我需要为一个核心配置类实现单例模式。在设计过程中,我发现要同时满足延迟加载和线程安全这两个要求,常见的实现方式有两种:内部静态类和双重检查锁定(Double-Checked Locking, DCL)。 …

【计算机网络】 —— 数据链路层(壹)

文章目录 前言 一、概述 1. 基本概念 2. 数据链路层的三个主要问题 二、封装成帧 1. 概念 2. 帧头、帧尾的作用 3. 透明传输 4. 提高效率 三、差错检测 1. 概念 2. 奇偶校验 3. 循环冗余校验CRC 1. 步骤 2. 生成多项式 3. 例题 4. 总结 四、可靠传输 1. 基本…

golang实现简单的redis服务

golang 手搓redis服务器仓库地址:实现思路: golang 手搓redis服务器 仓库地址: 仓库: https://github.com/dengjiayue/my-redis.git 实现思路: ● 协议: tcp通信 ● 数据包: 长度(4byte)方法(1byte)数据json ● 数据处理: 单线程map读写 ○ 依次处理待处理队列的请求(chan)…

智慧银行反欺诈大数据管控平台方案(八)

智慧银行反欺诈大数据管控平台的核心理念,在于通过整合先进的大数据技术、算法模型和人工智能技术,构建一个全面、智能、动态的反欺诈管理框架,以实现对金融交易的全方位监控、欺诈行为的精准识别和高效处理。这一理念强调数据驱动决策&#…

3D 生成重建019-LERF用文本在Nerf中开启上帝之眼

3D 生成重建019-LERF用文本在Nerf中开启上帝之眼 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 人类利用自然语言描述物理世界,根据各种特性(视觉外观、语义、抽象关联)寻找具体的3D位置。在这项工作中,作者提出了语言嵌…

如何选择合适的期刊投稿?从课题组经验到在线工具的使用全解析

~~~本文是作者个人的经验分享,建立在导师让自己选刊的情况下~~~ 投稿选刊是科研过程中至关重要的一步,选刊过程可能让许多初投稿的研究者感到迷茫和困惑:期刊那么多,如何找到最合适的? 本文将从多个角度介绍如何选择投…

024、Docker与SSH在分布式系统中的实践指南

1. Docker SSH配置最佳实践 Docker容器通常不需要SSH服务来运行,因为它们设计为轻量级、无状态的,并且通常通过Docker命令行界面与宿主机进行交互。但是,在某些情况下,您可能需要通过SSH访问Docker容器进行调试、维护或其他操作。…

【kafka】消息队列的认识,Kafka与RabbitMQ的简单对比

什么是消息队列? 消息队列(Message Queue,简称 MQ)是一个在不同应用程序、系统或服务之间传递数据的机制。 它允许系统间异步地交换信息,而无需直接交互,确保消息的可靠传输。 想象一下,你正在…

.NET MAUI与.NET for Android/IOS的关系

2024年11月13日微软发布了.Net9.0,我打算体验一下。安装好.Net9.0 SDK后发现Visual Studio识别不到9.0,但是通过命令行dotnet --info查看是正常的,后面看到了VS有版本可以升级,把VS升级到17.12.0就可以了。更新完打开以后看到如下界面 这里…

SqlDataAdapter

SqlDataAdapter 是 .NET Framework 和 .NET Core 中提供的一个数据适配器类,属于 System.Data.SqlClient 命名空间(或在 .NET 6 中属于 Microsoft.Data.SqlClient 命名空间)。它的作用是充当数据源(如 SQL Server 数据库&#xff…