python进阶(22)pydantic--数据类型校验
pydantic库的作用
pydantic库是一种常用的用于数据接口schema定义与检查的库。Pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误信息。
pydantic安装
pip install pydantic
用法详解
模型
- 在
pydantic中定义对象的主要方法是通过模型(模型是继承自BaseModel的类)。 - 将模型看作严格类型语言中的类型(例如Java),或者看作API中单个端点的需求。
- 不受信任的数据可以传递给模型,在解析和验证之后,
pydantic保证结果模型实例的字段将符合模型上定义的字段类型。
注意事项
pydantic是一个解析库,而不是一个验证库。- 验证是达到目的的一种手段:构建符合所提供的类型和约束的模型。
- 换句话说,
pydantic保证输出模型的类型和约束,而不是输入数据。
基础模型使用
from pydantic import BaseModel
class User(BaseModel):
id: int
name = "Silent丿丶黑羽"
- User这是一个有两个字段的模型
- id是一个整型,必填项
- name是一个有默认值的字符串,不是必填项
为什么name字段不需要声明类型
- name 的类型是从其默认值推断来的,因此,类型注解不是必需的
- 有些字段没有指定类型,可能会引发字段顺序的警告
user = User(id="123")
print(type(user)) # <class '__main__.User'>
print(user) # id=123 name='Silent丿丶黑羽'
这里的 user 是 User 的一个实例。对象的初始化会执行所有解析和验证,如果没有引发 ValidationError 异常,则表明结果模型实例是有效的。
这里我们传入了的id是一个字符串,但实际打印出来却是整型,是因为pydantic在数据传输时会直接进行数据转换
模型属性
模型有多个属性和方法,我们依次介绍
dict()
返回模型的字段和值的字典
user = User(id=123)
print(user.dict()) # {'id': 123, 'name': 'jkc'}
print(type(user.dict())) # <class 'dict'>
json()
返回表示 dict() 的 JSON 字符串
user = User(id=123)
print(user.json()) # {"id": 123, "name": "jkc"}
print(type(user.json())) # <class 'str'>
copy()
返回模型的拷贝,默认是浅拷贝
user = User(id=123)
print(user.copy()) # id=123 name='jkc'
parse_obj()
这与模型的_init__方法非常相似,只是它采用dict而不是关键字参数。如果传递的对象不是dict,将引发ValidationError。
user = User(id=123)
print(user.parse_obj({"id": 3, "name": "jkc"})) # id=3 name='jkc'
print(user.parse_obj(['a'])) # 引发ValidationError错误
&
parse_raw()
用于加载多种格式字符串的实用程序
user = User(id=123)
print(user.parse_raw('{"id": 3, "name": "jkc"}')) # id=3 name='jkc'
parse_file()
与 parse_raw() 类似,但是是接收文件路径,读取文件并将内容传递给parse_raw
path = Path('data.json')
path.write_text('{"id": 123, "name": "James"}')
m = User.parse_file(path)
print(m) # id=123 signup_ts=None name='James'
schema()
返回以 JSON Schema 形式返回模型,以字典格式
user = User(id=123, name="jkc")
print(user.schema())
print(type(user.schema()))
# 输出结果
{
"title":"User",
"type":"object",
"properties":{
"id":{
"title":"Id",
"type":"integer"
},
"name":{
"title":"Name",
"default":"jkc",
"type":"string"
}
},
"required":[
"id"
]
}
<class 'dict'>
schema_json()
返回以 JSON Schema 形式返回模型,以JSON字符串形式
user = User(id=123, name="jkc")
print(user.schema_json())
print(type(user.schema_json()))
# 输出结果
{
"title":"User",
"type":"object",
"properties":{
"id":{
"title":"Id",
"type":"integer"
},
"name":{
"title":"Name",
"default":"jkc",
"type":"string"
}
},
"required":[
"id"
]
}
<class 'str'>
fields_set
返回用户初始化对象时提供了什么字段
user = User(id=123)
print(user.__fields_set__) # {'id'}
user = User(id=123, name="jkc")
print(user.__fields_set__) # {'name', 'id'}
config
模型的配置类(后续更新)
python进阶(22)pydantic--数据类型校验的更多相关文章
- Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束
Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎: MySQL中的数据用各种不同的技术存储在文件( ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)
Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...
- python进阶篇
python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. import sys ...
- Python进阶(一)----函数
Python进阶(一)----函数初识 一丶函数的初识 什么函数: 函数是以功能为导向.一个函数封装一个功能 函数的优点: 1.减少代码的重复性, 2.增强了代码的可读性 二丶函数的结构 ...
- python进阶资源
本文为不同阶段的Python学习者从不同角度量身定制了49个学习资源. 初学者 Welcome to Python.org https://www.python.org/ 官方Python站点提供了一 ...
- Python学习day09 - Python进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python 进阶(五)定制类
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAF/CAIAAACUs6uhAAAgAElEQVR4nOzdZXubx7ov8PPV9tlrt0 ...
- python进阶学习笔记(一)
python进阶部分要学习的内容: 学习目标: 1.函数式编程 1.1,什么是函数式编程 函数式编程是一种抽象计算的编程模式 不同语言的抽象层次不同: 函数式编程的特点: python支持的函数式编程 ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
随机推荐
- COS控制台进阶 - 文件预览和在线编辑
导语 | COS控制台新上线了文件预览功能,用户可在控制台内直接预览.编辑文件内容. 前不久,微软发布了 vscode for web 的公告,是基于web的在线代码编辑器,无需下载安装可以直接在we ...
- 微信小程序适配iphoneX的实现方法
一. 安全区域(safe area) 与iPhone6/6s/7/8相比,iPhone X 无论是在屏幕尺寸.分辨率.甚至是形状上都发生了较大的改变,下面以iPhone 8作为参照物,先看看iPhon ...
- Spring Boot中如何配置线程池拒绝策略,妥善处理好溢出的任务
通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务.为异步任务配置线程池.使用多个线程池隔离不同的异步任务.今天这篇,我们继续对上面的知识进行完善和优化 ...
- Jmeter系列(18)- 八大组件
说明 取样器(Sampler):不与其他元件发⽣交互的作⽤的元件 逻辑控制器(Logic Controller):只对其⼦节点的sampler有效,⽽其他元件需要与sampler等元件交互 前置处理器 ...
- python编码问题:UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 68: illegal multibyte sequence
import yaml def test_yaml(): f = open('C:\hogwarts\Scripts\hogwarts-api\demo\yaml_data.yml') print(y ...
- P1791-[国家集训队]人员雇佣【最大权闭合图】
正题 题目链接:https://www.luogu.com.cn/problem/P1791 题目大意 有\(n\)个人,雇佣第\(i\)个需要\(A_i\)的费用,对于\(E_{i,j}\)表示如果 ...
- 数据库InnoDB和MyISAMYSQL的区别
1.nnoDB支持事务,MyISAM不支持,这一点是非常之重要.事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了. 2.MyISAM适合查询以及插入为主 ...
- HTML5元素背景知识
目录 HTML5元素背景知识 语义与呈现分离 元素选用原则 少亦可为多 别误用元素 具体为佳,一以贯之 对用户不要想当然 元素说明体例 ol元素 元素速览 文档和元数据元素 文档和元数据元素 文本元素 ...
- 这么多TiDB负载均衡方案总有一款适合你
[是否原创]是 [首发渠道]TiDB 社区 前言 分布式关系型数据库TiDB是一种计算和存储分离的架构,每一层都可以独立地进行水平扩展,这样就可以做到有的放矢,对症下药. 从TiDB整体架构图可以看到 ...
- PAT (Basic Level) Practice (中文)1009 说反话 (20分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小 ...