5分钟掌握Pydantic

数据模型定义:使用 Python 类来定义数据模型,这些类可以自动将输入转换为 Python 数据类型。

from pydantic import BaseModelclass User(BaseModel):id: intname: stremail: str

类型检查:Pydantic 强制执行类型检查,确保传入的数据符合模型定义的类型。

user = User(id=1, name='John Doe', email='john.doe@example.com')
# 如果传递错误的类型,比如将id作为字符串,将会引发错误

自动转换:Pydantic 可以将字符串输入自动转换为 Python 原生类型,如 int, float, bool, datetime 等。

class User(BaseModel):id: int = Field(..., alias='user_id')  # 使用别名email: struser = User(user_id='123', email='john.doe@example.com')
print(user.id)  # 输出: 123

错误处理:当输入数据不符合模型定义时,Pydantic 提供了详细的错误信息,方便调试。

try:User(id='invalid', name='John Doe', email='john.doe@example.com')
except ValidationError as e:print(e.json())

配置选项:Pydantic 允许通过配置选项来自定义模型的行为,如是否允许额外字段,是否进行严格的类型检查等。

from pydantic import BaseModel, Extra, Field# 定义一个模型
class User(BaseModel):id: intname: stremail: str# 内部类 Config 用于设置配置选项class Config:# 指定如何处理模型中未定义的额外字段extra = Extra.allow  # 允许额外字段,它们将被存储在模型的 additional 字典中# 指定是否允许修改模型实例的属性allow_mutation = False  # 不允许修改,使模型实例成为不可变的# 指定是否将 JSON 字段名作为属性名,而不是 Python 变量名alias_generator = lambda x: x  # 使用字段的 JSON 名称作为属性名# 指定是否将带下划线的属性视为私有underscore_attrs_are_private = True  # 将带下划线的属性视为私有# 指定是否在模型初始化时进行严格的类型检查strict_types = True  # 开启严格类型检查# 指定是否允许使用任意类型作为字段类型arbitrary_types_allowed = False  # 不允许任意类型# 指定是否将枚举的值用作 JSON 序列化use_enum_values = True  # 使用枚举值而不是枚举的名称# 指定 JSON 编码器json_encoders = {int: lambda x: str(x)  # 为整数定义自定义 JSON 编码器}# 为 JSON Schema 指定额外的字段json_schema_extra = {'example': {'id': 1, 'name': 'Alice', 'email': 'alice@example.com'}  # 示例数据}

泛型模型:支持泛型模型,可以创建基于泛型的复杂数据结构。

from typing import List, Dictclass ModelGenerics(BaseModel):data: List[str]config: Dict[str, str]data = ModelGenerics(data=['item1', 'item2'], config={'key': 'value'})

在 Python 3.5 中引入,作为对泛型的支持。

在 Python 的 typing 模块中,Optional 和 Union 是两个非常有用的类型注解工具,它们经常一起使用来表达某些类型上的需求。

Optional

Optional 是一个用于表示某个类型的值可能存在,也可能是 None 的类型注解。它通常用于函数注解中,来表明一个参数可以被省略(默认为 None),或者一个变量可能有值或没有值。

Union

Union 是一个类型注解工具,它允许一个变量可以是多种类型中的一种。它使用圆括号 () 来包裹多个类型,表示变量可以是这些类型中的任何一个。

Optional[Union[int, str]]

当你看到 Optional[Union[int, str]] 这样的类型注解时,它的意思是:

  • 这个注解表示的变量可以接受以下三种情况之一:
    1. 一个整数 (int)
    2. 一个字符串 (str)
    3. 没有值,即 None

在函数注解中,这通常表示一个参数可以是整数、字符串或者完全不传(默认为 None)。
下面是一个使用 Optional[Union[int, str]] 的例子:

from typing import Optional, Uniondef process_value(value: Optional[Union[int, str]]) -> str:if value is None:return "No value provided"elif isinstance(value, int):return f"The value is an integer: {value}"elif isinstance(value, str):return f"The value is a string: {value}"else:return "Unknown type"

Callable
在 Python 中,Callable 是 typing 模块提供的一个泛型类型,用于注解函数对象。当你想要定义一个变量、参数或者返回值必须是一个函数时,可以使用 Callable。
Callable 的使用格式如下:

Callable[[arg1_type, arg2_type, ..., argN_type], return_type]
  • arg1_type, arg2_type, …, argN_type 是函数参数的类型。
  • return_type 是函数返回值的类型。

JSON 支持:Pydantic 可以轻松地将模型序列化为 JSON,也可以从 JSON 反序列化模型。

序列化为 JSON

user = User(id=1, name='John Doe', email='john.doe@example.com')
user_json = user.json()  # 序列化为JSON字符串
print(user_json)

JSON 反序列化模型

'{"id": 1,"name": "John Doe","email": "john.doe@example.com"
}'user_json = '''
{"id": 1,"name": "John Doe","email": "john.doe@example.com"
}
'''user = User.parse_raw(user_json)
print(user)
print(user.id, user.name, user.email)

环境变量加载:Pydantic 可以自动从环境变量中加载配置。

from pydantic import BaseSettings# 定义一个继承自 BaseSettings 的 Settings 类
class Settings(BaseSettings):# 定义一个名为 DEBUG 的布尔类型配置项,并设置默认值为 FalseDEBUG: bool = False# 定义一个名为 DB_USER 的字符串类型配置项,没有默认值,需要从环境变量或其它方式提供DB_USER: str# 定义一个名为 DB_PASSWORD 的字符串类型配置项,同样需要外部提供DB_PASSWORD: str# 创建 Settings 类的实例
settings = Settings()# 打印 DEBUG 配置项的值,由于没有指定环境变量或其它赋值方式,将输出默认值 False
print(settings.DEBUG)# 尝试打印 DB_USER 配置项的值
# 如果没有通过环境变量或其它方式提供 DB_USER 的值,这将抛出一个错误,因为没有默认值
print(settings.DB_USER)

字段校验:提供了多种字段校验器,用于验证数据的有效性,如长度、正则表达式匹配等。

from pydantic import BaseModel, Field, validator
from typing import Listclass User(BaseModel):name: stremail: strpasswords: List[str] = Field(..., min_items=2)@validator('email')def email_must_contain_at(cls, v):if '@' not in v:raise ValueError('must contain @')return vuser = User(name='John', email='john.doe', passwords=['pass1', 'pass2'])

pydantic 与JSON Schema 关系与关系

JSON Schema 是一种基于 JSON 格式的声明性语言,用于描述和验证 JSON 数据结构。它最初由 JSON 的创建者 Douglas Crockford 提出概念,并由一个社区驱动的进程进一步开发和标准化。JSON Schema 的目的是为了让 JSON 数据能够自我描述,即包含足够的元数据来描述其自身的结构,从而允许自动化的验证和编辑。

JSON Schema 的主要用途包括:

  1. 数据验证:确保 JSON 数据符合预定义的模式,比如检查数据类型、格式、长度等。
  2. 自动化测试:自动化测试工具可以使用 JSON Schema 来验证 API 返回的数据是否符合预期。
  3. API 文档:作为 API 文档的一部分,帮助开发者理解 API 请求和响应的数据结构。
  4. 配置管理:用于定义配置文件的结构,确保配置文件中的设置是有效和合理的。
  5. 用户界面生成:基于 JSON Schema 自动生成表单和用户界面,以输入和编辑数据。
  6. 数据交换:作为不同系统或组件之间交换数据时的契约,确保数据的兼容性。

JSON Schema 被广泛应用于各种编程语言和环境中,是现代软件开发中数据验证和描述的重要工具之一。随着 JSON 格式的普及,JSON Schema 也成为了描述 JSON 数据的事实标准之一。

要将 Pydantic 模型转换为 JSON Schema,你可以使用模型的 schema() 方法。下面是一个示例:

from pydantic import BaseModel, Fieldclass User(BaseModel):id: intname: stremail: str# 定义一个字段的额外信息,比如示例值email = Field(..., example='user@example.com')# 获取 JSON Schema 表示
schema = User.schema()print(schema)

运行上述代码会输出类似于下面的 JSON Schema:

{"$schema": "http://json-schema.org/draft-07/schema#","title": "User","type": "object","properties": {"id": {"type": "integer"},"name": {"type": "string"},"email": {"type": "string","format": "email"}},"required": ["id","name","email"],"example": {"id": 0,"name": "","email": "user@example.com"}
}

请注意,输出的 JSON Schema 包含了模型的所有字段,它们的类型,以及是否是必须的。此外,如果字段使用了 Field 函数来定义额外的元数据(如示例值),这些信息也会被包含在内。

JSON Schema 可以用于各种用途,包括:

  • 自动化测试:验证输入数据是否符合预期的模型。
  • API 文档:为 API 提供正式的、可机器读取的文档。
  • 代码生成:基于 JSON Schema 自动生成代码,如客户端库或服务端存根。
  • 交互式表单:基于 JSON Schema 自动生成表单界面。

Pydantic 的 schema() 方法是一个非常强大的工具,可以帮助你将 Python 模型定义转换为一个广泛接受的、标准化的格式。

Pydantic 支持嵌套模型,这意味着你可以在一个 Pydantic 模型中定义另一个 Pydantic 模型作为其字段之一。这使得你可以创建复杂的数据结构,如对象包含对象,或者对象包含数组等。

嵌套模型示例

假设我们有一个博客系统,需要定义 PostUser 两个模型,其中 Post 模型嵌套了 User 模型:

from pydantic import BaseModelclass User(BaseModel):name: stremail: strclass Post(BaseModel):title: strcontent: strauthor: User  # 这里 Post 嵌套了 User 模型作为其字段published: bool = False# 创建 Post 实例
post = Post(title='Pydantic 嵌套模型',content='Pydantic 是多么方便啊!',author=User(name='Alice', email='alice@example.com'),published=True
)print(post)

在这个例子中:

  • User 是一个包含 nameemail 字段的 Pydantic 模型。
  • Post 是另一个 Pydantic 模型,它有一个 author 字段,该字段的类型是 User。这样,Post 模型就嵌套了 User 模型。
  • 创建 Post 实例时,你需要为 author 字段提供一个 User 实例。

嵌套模型的 JSON Schema

当你为嵌套的 Pydantic 模型生成 JSON Schema 时,Pydantic 会自动处理这些嵌套关系,生成相应的 schema:

print(Post.schema())

这将输出一个包含 PostUser 模型的 JSON Schema,其中 Postauthor 字段会链接到 User 的 schema。

嵌套模型的序列化和反序列化

Pydantic 同样支持嵌套模型的序列化(将模型实例转换为 JSON)和反序列化(从 JSON 创建模型实例):

# 序列化 Post 实例为 JSON
post_json = post.json()
print(post_json)# 假设有一段 JSON 字符串表示 Post
post_json_str = '''
{"title": "Pydantic 嵌套模型","content": "Pydantic 是多么方便啊!","author": {"name": "Alice","email": "alice@example.com"},"published": true
}
'''# 反序列化 JSON 字符串为 Post 实例
post_from_json = Post.parse_raw(post_json_str)
print(post_from_json)

通过嵌套模型,Pydantic 提供了一种强大的方式来处理复杂的数据结构,同时保持了序列化和反序列化的便利性。

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

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

相关文章

小旋风蜘蛛池优化版

下载地址:小旋风蜘蛛池.zip 配置的时候需要做伪静态 #如果用的是宝塔面板设置伪静态,则去掉 第一行 的 location / { 和最后一行的 } location / { rewrite ^/template/(.*)\.html$ /index.php last; rewrite ^/temp/(data|db|robotlog|tplrules|errp…

前端css中animation(动画)的使用

前端css中animation的使用 一、前言二、主要内容说明(一)、animation-name(名称)属性(二)、animation-duration(持续时间)属性1.前两个属性举例,源码12.源码1运行效果&am…

Redis线程模型

文章目录 💖 Redis 单线程模型⭐ 单线程监听大量的客户端连接⭐ Redis 6.0 之前为什么不用多线程? 💖 Redis多线程⭐ Redis 后台线程⭐ Redis 网络IO多线程 对于读写命令来说,Redis 一直是单线程模型。不过,在 Redis 4…

SinoDB数据库的RAW TABLE

RAW表是不记录日志的永久表,类似于无日志模式数据库中的表。对于RAW表,支持对其进行更新、插入和删除操作,但日志是不会记录这些操作。可以在RAW表上定义索引,但不能在RAW表上定义唯一约束、主键约束或引用约束(refere…

语音识别之特征提取与起始检测

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

关闭前端统一请求库设计与落地

前言 对于一个前端工程师而言,每天都在面对的较多的需求场景就是调用后端的接口,但是因为众所周知的原因,前端目前已经有无数种调用接口的方式,例如:之前有基于 XHR、Axios、Fetch 进行封装的工具,大家都试…

2-qt之信号与槽-简单实例讲解

前言、因实践课程讲解需求,简单介绍下qt的信号与槽。 一、了解信号与槽 怎样使用信号与槽? 概览 还记得 X-Window 上老旧的回调函数系统吗?通常它不是类型安全的并且很复杂。(使用)它(会)有很多…

prometheus+grafana的安装与部署及优点

一、Prometheus 的优点 1、非常少的外部依赖,安装使用超简单; 2、已经有非常多的系统集成 例如:docker HAProxy Nginx JMX等等; 3、服务自动化发现; 4、直接集成到代码; 5、设计思想是按照分布式、微服…

springboot webscoket示例:增加定时心跳逻辑

websocket服务端增加定时发送心跳机制 ServerEndpoint(value "/websocket/{uuid}") Component public class DevMessageHandleController {private static final Logger logger LoggerFactory.getLogger(DevMessageHandleController.class);//concurrent包的线程安…

数组扁平化

数组扁平化 输入&#xff1a;[1,[2,[3,5],5],6] 输出&#xff1a;[1,2,3,4,5,6] 方法一&#xff1a;递归 const transformArray (arr, res) > {for (let i 0; i < arr.length; i) {if (arr[i] instanceof Array) {transformArray(arr[i], res)} else {res.push(arr…

面试官:谈谈你知道的设计模式❓

创建型模式&#x1f527; 1&#xff09;单例模式&#xff08;Singleton&#xff09;&#x1f6a9; 确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 2&#xff09;工厂方法模式&#xff08;Factory Method&#xff09;&#x1f6a9; 定义一个创建对象的接口&#…

YashanDB与帆软信创商业智能软件完成兼容互认证

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与帆软信创商业智能软件&#xff08;V6.0&#xff09;顺利完成兼容性互认证&#xff0c;经严格测试&#xff0c;双方产品能够相互兼容&#xff0c;稳定运行。 崖山数据库系统YashanDB是深圳计算科学研究院自主研发设计…

构建第一个ArkTS应用之@LocalStorage:页面级UI状态存储

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…

openGauss学习笔记-276 openGauss性能调优-实际调优案例05-改建分区表

文章目录 openGauss学习笔记-276 openGauss性能调优-实际调优案例05-改建分区表276.1 现象描述276.2 优化分析openGauss学习笔记-276 openGauss性能调优-实际调优案例05-改建分区表 276.1 现象描述 如下简单SQL语句查询, 性能瓶颈点在normal_date的Scan上。 QUERY PLAN ----…

[开发|安卓] Android Studio 开发环境配置

Android Studio下载 Android Studio下载地址 下载SDK依赖 1.点击左上角菜单 2.选择工具 3.打开SDK管理中心 4.下载项目目标Android版本的SDK 配置安卓虚拟机 1.打开右上角的设备管理 2.选择合适的手机规格 3.下载并选择项目目标Android系统 4.点击完成配置 …

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机&#xff1f;手机环境怎么搭建&#xff1f;这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 &#xff1a; 步骤一&#xff1a;手机调试 苹果手机系统配置推荐&#xff1a;iPhone6S以上&#xff0c;16G。 注意&#xff1a;如果是选择购入二手手机…

指针进阶(三)

嘿嘿,uu们,今天呢我们来剖析指针进阶的剩下部分,好啦,废话不多讲,开干! 1:回调函数 概念:回调函数是指一个通过函数指针调用的函数,如果将函数的地址作为参数传递给另外一个函数,当这个指针被用来调用所指向的函数时,那么这个被调用的函数就是回调函数.回调函数不是由该函数的…

2024年中国AI大模型产业发展报告,洞见下一个智能时代!

人民网财经研究院、至顶科技联合发布的《开启智能新时代&#xff1a;2024年中国AI大模型产业发展报告》,全面梳理了我国AI大模型产业的发展背景、现状、应用案例、面临的挑战以及未来趋势。报告指出,AI大模型是全球科技竞争的新高地、未来产业的新赛道、经济发展的新引擎,在我国…

【微磁学3D绘图工具探索】Paraview

文章目录 概要Material Science版块介绍 概要 微磁学中的磁学结构同时包括二维和三维&#xff0c;想要绘制得好看&#xff0c;结果清晰&#xff0c;那么就需要一些自己写的绘图代码之外的额外渲染功能&#xff0c;尤其是对于三维结构的处理&#xff0c;一个好的渲染能够带来很…

如何高效封装App?小猪APP分发平台一站式解决方案

在移动应用开发领域&#xff0c;App封装&#xff08;App Packaging&#xff09;是一个至关重要的环节&#xff0c;它不仅关乎应用的安全性&#xff0c;还直接影响到最终用户体验和市场推广策略。本文旨在通过实战指南&#xff0c;揭示如何高效完成App封装&#xff0c;并介绍如何…