Pydantic 实践
1. 简介
pydantic 库是一种常用的用于数据接口 schema 定义与检查的库。
通过 pydantic 库,我们可以更为规范地定义和使用数据接口,这对于大型项目的开发将会更为友好。
当然,除了 pydantic 库之外,像是 valideer 库、marshmallow 库、trafaret 库以及 cerberus 库等都可以完成相似的功能,但是相较之下,pydantic 库的执行效率会更加优秀一些。
因此,这里,我们仅针对 pydantic 库来介绍一下如何规范定义标准 schema 并使用。
安装部署
pip install pydantic
2. 使用方法
2.1. schema 基本定义
pydantic 库的数据定义方式是通过 BaseMode l类来进行定义的,所有基于pydantic的数据类型本质上都是一个BaseModel类,它最基本的使用方式如下:
from pydantic import BaseModelclass Person(BaseModel):name: str
2.2. schema 基本实例化
调用时,我们只需要对其进行实例化即可,实例化方法有以下几种:
直接传值
p = Person(name="Tom")
print(p.json()) # {"name": "Tom"}
通过字典传入
p = {"name": "Tom"}
p = Person(**p)
print(p.json()) # {"name": "Tom"}
通过其他的实例化对象传入
p2 = Person.copy(p)
print(p2.json()) # {"name": "Tom"}
2.3. 异常处理
当传入值错误的时候,pydantic就会抛出报错,例如:
Person(person="Tom") # 定义为name,而非person
pydantic会抛出异常:
ValidationError: 1 validation errors for Person
namefield required (type=value_error.missing)
2.4. 参数过滤
另一方面,如果传入值多于定义值时,BaseModel 也会自动对其进行过滤。如:
p = Person(name="Tom", gender="man", age=24)
print(p.json()) # {"name": "Tom"}
可以看到,额外的参数 gender 与 age 都被自动过滤了。
通过这种方式,数据的传递将会更为安全,但是,同样的,这也要求我们在前期的 schema 定义中必须要尽可能地定义完全。
2.5. 阴性类型转换
此外,pydantic 在数据传输时会直接进行数据类型转换,因此,如果数据传输格式错误,但是可以通过转换变换为正确的数据类型是,数据传输也可以成功,例如:
p = Person(name=123)
print(p.json()) # {"name": "123"}
3. pydantic 数据类型
3.1. 基本数据类型
下面,我们来看一下pydantic中的一些常用的基本类型。
from pydantic import BaseModel
from typing import Dict, List, Sequence, Set, Tupleclass Demo(BaseModel):a: int # 整型b: float # 浮点型c: str # 字符串d: bool # 布尔型e: List[int] # 整型列表f: Dict[str, int] # 字典型,key为str,value为intg: Set[int] # 集合h: Tuple[str, int] # 元组
3.2. 高级数据结构
这里,我们给出一些较为复杂的数据类型的实现。
3.2.1. enum 数据类型
enum型数据类型我们可以通过enum库进行实现,给出一个例子如下:
from enum import Enumclass Gender(str, Enum):man = "man"women = "women"
3.2.2. 可选数据类型
如果一个数据类型不是必须的,可以允许用户在使用中不进行传入,则我们可以使用typing库中的Optional方法进行实现。
from typing import Optional
from pydantic import BaseModelclass Person(BaseModel):name: strage: Optional[int]
需要注意的是,设置为可选之后,数据中仍然会有age字段,但是其默认值为None,即当不传入age字段时,Person仍然可以取到age,只是其值为None。例如:
p = Person(name="Tom")
print(p.json()) # {"name": "Tom", "age": None}
3.2.3. 数据默认值
上述可选数据类型方法事实上是一种较为特殊的给予数据默认值的方法,只是给其的默认值为None。这里,我们给出一些更加一般性的给出数据默认值的方法。
from pydantic import BaseModelclass Person(BaseModel):name: strgender: str = "man"p = Person(name="Tom")
print(p.json()) # {"name": "Tom", "gender": "man"}
3.2.4. 允许多种数据类型
如果一个数据可以允许多种数据类型,我们可以通过 typing 库中的 Union 方法进行实现。
from typing import Union
from pydantic import BaseModelclass Time(BaseModel):time: Union[int, str]t = Time(time=12345)
print(t.json()) # {"time": 12345}
t = Time(time = "2020-7-29")
print(t.json()) # {"time": "2020-7-29"}
3.2.5. 异名数据传递
假设我们之前已经定义了一个schema,将其中某一个参量命名为了A,但是在后续的定义中,我们希望这个量被命名为B,要如何完成这两个不同名称参量的相互传递呢?
我们可以通过 Field 方法来实现这一操作。
from pydantic import BaseModel, Fieldclass Password(BaseModel):password: str = Field(alias = "key")
则在传入时,我们需要用key关键词来传入password变量。
p = Password(key="123456")
print(p.json()) # {"password": "123456"}
3.2.6. 多级 schema 定义
这里,我们给出一个较为复杂的基于pydantic的schema定义实现样例。
from enum import Enum
from typing import List, Union
from datetime import date
from pydantic import BaseModelclass Gender(str, Enum):man = "man"women = "women"class Person(BaseModel):name : strgender : Genderclass Department(BaseModel):name : strlead : Personcast : List[Person]class Group(BaseModel):owner: Personmember_list: List[Person] = []class Company(BaseModel):name: strowner: Union[Person, Group]regtime: datedepartment_list: List[Department] = []
需要注意的是,我们除了可以一步一步地实例化之外,如果我们已经有了一个完整的Company的内容字典,我们也可以一步到位地进行实例化。
sales_department = {"name": "sales","lead": {"name": "Sarah", "gender": "women"},"cast": [{"name": "Sarah", "gender": "women"},{"name": "Bob", "gender": "man"},{"name": "Mary", "gender": "women"}]
}research_department = {"name": "research","lead": {"name": "Allen", "gender": "man"},"cast": [{"name": "Jane", "gender": "women"},{"name": "Tim", "gender": "man"}]
}company = {"name": "Fantasy","owner": {"name": "Victor", "gender": "man"},"regtime": "2020-7-23","department_list": [sales_department,research_department]
}company = Company(**company)
3.3. 数据检查
pydantic 本身提供了上述基本类型的数据检查方法,但是,除此之外,我们也可以使用 validator 和 config 方法来实现更为复杂的数据类型定义以及检查。
3.3.1. validator用法
使用validator方法,我们可以对数据进行更为复杂的数据检查。
import re
from pydantic import BaseModel, validatorclass Password(BaseModel):password: str@validator("password")def password_rule(cls, password):def is_valid(password):if len(password) < 6 or len(password) > 20:return Falseif not re.search("[a-z]", password):return Falseif not re.search("[A-Z]", password):return Falseif not re.search("\d", password):return Falsereturn Trueif not is_valid(password):raise ValueError("password is invalid")
通过这种方式,我们就可以额外对密码类进行格式要求,对其字符数以及内部字符进行要求。
3.3.2. Config 方法
如果要对BaseModel中的某一基本型进行统一的格式要求,我们还可以使用Config方法来实现。
from pydantic import BaseModelclass Password(BaseModel):password: strclass Config:min_anystr_length = 6 # 令Password类中所有的字符串长度均要不少于6max_anystr_length = 20 # 令Password类中所有的字符串长度均要不大于20
4. 模型属性
dict() 模型字段和值的字典
json() JSON 字符串表示dict()
copy() 模型的副本(默认为浅表副本)
parse_obj() 使用dict解析数据
parse_raw 将str或bytes并将其解析为json,然后将结果传递给parse_obj
parse_file 文件路径,读取文件并将内容传递给parse_raw。如果content_type省略,则从文件的扩展名推断
from_orm() 从ORM 对象创建模型
schema() 返回模式的字典
schema_json() 返回该字典的 JSON 字符串表示
construct() 允许在没有验证的情况下创建模型
fields_set 初始化模型实例时设置的字段名称集
fields 模型字段的字典
config 模型的配置类
参考:
https://blog.csdn.net/codename_cys/article/details/107675748
https://www.cnblogs.com/dyl0/articles/16896330.html
相关文章:
Pydantic 实践
1. 简介 pydantic 库是一种常用的用于数据接口 schema 定义与检查的库。 通过 pydantic 库,我们可以更为规范地定义和使用数据接口,这对于大型项目的开发将会更为友好。 当然,除了 pydantic 库之外,像是 valideer 库、marshmallo…...
获取pandas中的众数
pandas.DataFrame 也有一个 mode() 方法。 以下面的 pandas.DataFrame 为例。 df pd.DataFrame({‘col1’: [‘X’, ‘X’, ‘Y’, ‘X’], ‘col2’: [‘X’, ‘Y’, ‘Y’, ‘X’]}, index[‘row1’, ‘row2’, ‘row3’, ‘row4’]) print(df) col1 col2 row1 X X row2…...
SOLIDWORKS Simulation2024仿真10大新功能
SOLIDWORKS Simulation新增功能 1. 增强型轴承接头 •通过指定压缩、拉伸和弯曲的刚度,轻松创建自定义轴承接头。•通过向非线性和大型位移算例添加自定义条件,提高模拟精度。 优点:使用功能强大的接口,更轻松 、 更 准 确 地 设…...
Java程序设计2023-第二次上机练习
这里要用到一些面向对象的基本知识 目录 7-1 伪随机数 输入格式: 输出格式: 输入样例: 输出样例: 7-2 jmu-Java-03面向对象基础-01-构造方法与toString 1.编写无参构造函数: 2.编写有参构造函数 3.覆盖toString函数: 4.对每个属性生成setter…...
如何在 uniapp 里面使用 pinia 数据持久化 (pinia-plugin-persistedstate)
想要在 uniapp 里面使用 pinia-plugin-persistedstate 会遇到的问题就是 uniapp里面没有浏览器里面的 sessionStorage localStorage 这些 api。 我们只需要替换掉 pinia-plugin-persistedstate 默认的储存 api 就可以了。使用 createPersistedState 重新创建一个实例, 把里面的…...
智慧矿山AI算法助力护帮板支护监测,提升安全与效率
在智慧矿山AI算法系列中,护帮板支护监测是保障矿山安全和提高生产效率的重要环节。护帮板作为矿山支护体系中的重要组成部分,在矿山生产中起到了关键的作用。那么,护帮板在哪种状态下是正常打开的呢?本文将对此进行介绍。 护帮板的…...
shell中的运算
目录 1.运算符号 2.运算指令 练习 1.运算符号 运算符号意义加法-减法*乘法/除法%除法后的余数**乘方自加一- -自减一<小于<小于等于>大于>大于等于等于ji ->jji*j*i->jj*i/j/i->jj/i%j%i->jj%i 2.运算指令 (()) //((a12))let //let a12 …...
【Java 进阶篇】解决Java Web应用中请求参数中文乱码问题
在Java Web应用开发中,处理请求参数时经常会遇到中文乱码的问题。当浏览器向服务器发送包含中文字符的请求参数时,如果不正确处理,可能会导致乱码问题,使得参数无法正确解析和显示。本文将详细探讨Java Web应用中请求参数中文乱码…...
51单片机-点阵屏led
代码配置 这样就能选择每一列哪个亮了 进行位选,段清零,这样就不会影响多列同时了 实现动画 1、使用文字摸提取文件,提取图案的16进制表示数组 offest作为偏移量,count作为计时。count10,偏移量加1,就相当于得到下一…...
Angular-03:组件模板
各种学习后的知识点整理归纳,非原创! 组件模板 ① 数据绑定② 属性绑定③ 类名绑定④ 样式绑定⑤ 事件绑定⑥ 获取原生DOM对象6.1 在组件模板中获取6.2 在组件类中获取 ⑦ 双向数据绑定⑧ 内容投影8.1 select选择器8.2 单槽投影8.3 多槽投影 ⑨ 安全操作…...
mysql 操作慢查询日志
1、mysql 批量插入300w数据 CREATE PROCEDURE test_insert_200w() BEGINDECLARE i INT;SET i1;WHILE i<3000000 DOINSERT INTO shop_user (password, telephone, username) VALUES (admin, 15510304125, concat(admin, i));SET ii1;END WHILE; END; //执行sql call test_in…...
illuminate/database 使用 二
上一篇文章写怎么单独使用illuminate/database,这回讲下怎么整合到项目里使用。为此特意看了下laravel对其使用。本篇文章,参照laravel的使用,简单实现。 一 原理 laravel 里使用illuminate/config。 illuminate/config composer 地址&…...
二叉树的概念
文章目录 二叉树一、树的概念1.树形结构1.1. 树的特点:1.2 概念:1.3 树的表示形式 2.树的应用 二、二叉树1.二叉数的概念2.满二叉树3.完全二叉树4.二叉树的性质练习: 二叉树 一、树的概念 1.树形结构 1.1. 树的特点: 1.根节点没…...
SpringCloud之Eureka的学习【详细】
目录 服务架构演变 单体架构 分布式架构 分布式架构需要考虑的问题 微服务 架构比较 微服务技术对比 服务拆分注意事项 案例 服务远程调用 RestTemplate Eureka注册中心 RestTemplate存在的问题 服务调用考虑的问题 Eureka的作用 搭建EurekaServer 服务注册 …...
学习ftp
文章目录 一、FTP介绍二、两种模式(主动模式和被动模式)三、FTP配置文件详解四、实际场景举例五、黑白名单六、网络限制 一、FTP介绍 1.FTP(File Transfer Protocol)是一种应用广泛且古老的互联网文件传输协议。 2.主要应用于互联…...
Android笔记(九):Compose组件的状态(一)
在使用Compose定义UI界面时,可以发现界面的变换往往与Compose组件内部的状态相关,当状态值发生变化时,Compose构成的可组合的界面也会刷新发生相应的变化。将在本笔记中将对可组合项的状态的定义、状态提升、状态丢失和状态的保存进行简单介绍…...
3.2. onnx export multi_batch
前言 将onnx bs=1 修改为多batch操作 参考链接: https://www.cnblogs.com/tangjunjun/p/16500116.html https://blog.csdn.net/weixin_43863869/article/details/128638397?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault…...
探索低代码PaaS平台的优势与选择原因
PaaS是一种云产品,它为应用程序的开发和部署提供基础结构。它提供中间件、开发工具和人工智能来创建功能强大的应用程序,大多数PaaS服务都与存储和网络基础架构捆绑在一起,就像基础架构即服务(IaaS)一样,可…...
AD教程(一)工程组成及创建
AD教程(一)工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等,即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中,然后再添加连接的导线、网络标号。器件和器件之间的连接关系,在原…...
SAP业务从ECC升级到SAP S/4HANA有哪些变化?有哪些功能得到增强?
SAP在2015年推出了新一代商务套件SAP S/4 HANA。 SAP S/4 HANA (全称SAP Business suite 4 SAP HANA),这款新产品完全构建于目前先进的内存平台SAP HANA 之上,同时采用现代设计理念,通过SAP Fiori 提供精彩的用户体验 (UX)。提供比ECC更强大的功能。S/4h…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
