Python - pydantic 入门介绍与 Models 的简单使用
前言
为啥要学这个,因为 FastAPI 是基于它进行开发的,而且是个不错的框架,所以有必要深入学习
前置学习
Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html
typing 模块:https://www.cnblogs.com/poloyy/p/15150315.html
Pydantic 介绍
- 使用 python 类型注释来进行数据校验和 settings 管理
- pydantic 可以在代码运行时强制执行类型提示,并在数据校验无效时提供友好的错误提示
- 定义数据应该如何在规范的 python 代码中保存,然后通过 Python 验证它
Pydantic 安装
pip install pydantic
测试 pydantic 是否已编译
import pydantic
print('compiled:', pydantic.compiled)
# 输出结果
compiled: True
Pydantic 注意事项
- pydantic 是一个解析库,而不是一个验证库
- 验证是达到目的一种手段,构建符合所提供的类型和约束的模型
- 简单来说:pydantic 保证输出模型的类型和约束,而不是输入数据
Models
简介
- 在 pydantic 中定义对象的主要方法是通过模型(模型是从 BaseModel 继承的类)
- 所有基于 pydantic 的数据类型本质上都是一个 BaseModel
类 - 可以将模型视为强类型语言中的类型(比如 Java)
- 不受信任的数据可以传递给模型,经过解析和验证后,pydantic 保证生成的模型实例的字段将符合定义的字段类型(实例字段类型符合类定义的字段类型)
基础模型使用
from pydantic import BaseModel class User(BaseModel):
id: int
name = "小菠萝测试笔记"
- User 就是一个模型(Models),有两个字段(属性)
- id,整数 int 类型,是必传的
- name,字符串 string 类型,不是必传,有默认值
为什么能知道 name 是 string 类型?
因为默认值是 string 类型,因此不需要类型提示( name : string )
注意:当某些字段没有类型提示时,需要注意有关字段顺序的警告
声明一个有效实例
user = User(id='123')
- user 是 User 模型的一个实例对象,就叫模型实例对象吧
- 对象的初始化会执行所有解析和验证,如果没有抛出 ValidationError,证明生成的模型实例是有效的
访问模型实例对象的属性
user = User(id='123')
print(user.id, type(user.id))
print(user.name, type(user.name)) # 输出结果
123 <class 'int'>
小菠萝测试笔记 <class 'str'>
- id 属性传的是字符串 '123',它会根据模型字段类型进行转换为 int
- name 属性取了默认值
__fields_set__
该变量返回用户初始化对象时提供了什么字段
# __fields_set__
user = User(id='123') print(user.__fields_set__ == {'id'})
print(user.__fields_set__ == {'name'}) user = User(id='123', name="test") print(user.__fields_set__ == {'id', 'name'})
print(user.__fields_set__ == {'id'}) # 输出结果
True
False
True
False
dict()
可以提供字段的字典对象
# dict()
user = User(id='123')
print(user.dict())
print(dict(user)) # 输出结果
{'id': 123, 'name': '小菠萝测试笔记'}
{'id': 123, 'name': '小菠萝测试笔记'}
修改模型实例对象的属性
# 修改模型实例属性值
user = User(id='123')
user.id = 321
print(user.id) # 输出结果
321
Models 属性
其实就是 BaseModels 有什么自带的方法、属性
dict()
返回模型字段和值,字典格式
user = User(id='123', name="test")
print(user.dict(), type(user.dict())) # 输出结果
{'id': 123, 'name': 'test'} <class 'dict'>
json()
返回模型字段和值,json 字符串格式
user = User(id='123', name="test")
print(user.json(), type(user.json())) # 输出结果
{"id": 123, "name": "test"} <class 'str'>
schema()
以 JSON Schema 形式返回模型,字典格式
user = User(id='123', name="test") print(user.schema(), type(user.schema())) # 输出结果
{
"title": "User",
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"default": "小菠萝测试笔记",
"type": "string"
}
},
"required": [
"id"
]
} <class 'dict'>
schema_json()
以 JSON Schema 形式返回模型,json 字符串格式
user = User(id='123', name="test") print(user.schema_json(), type(user.schema_json())) # 输出结果
{
"title": "User",
"type": "object",
"properties": {
"id": {
"title": "Id",
"type": "integer"
},
"name": {
"title": "Name",
"default": "小菠萝测试笔记",
"type": "string"
}
},
"required": [
"id"
]
} <class 'str'>
copy()
浅拷贝模型对象
Python - pydantic 入门介绍与 Models 的简单使用的更多相关文章
- Dubbo入门介绍---搭建一个最简单的Demo框架
Dubbo入门---搭建一个最简单的Demo框架 置顶 2017年04月17日 19:10:44 是Guava不是瓜娃 阅读数:320947 标签: dubbozookeeper 更多 个人分类: D ...
- 【python】入门:打印字符串、简单计算
- [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...
- [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)
最近在使用Python爬取网页内容时,总是遇到JS临时加载.动态获取网页信息的困难.例如爬取CSDN下载资源评论.搜狐图片中的“原图”等,此时尝试学习Phantomjs和CasperJS来解决这个问题 ...
- Python入门介绍
Python入门介绍(人生苦短,我用 Python) Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 ...
- Python 基于python操纵redis入门介绍
基于python操纵redis入门介绍 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3.3.2 基于Python操作R ...
- python从入门到大神---4、python3文件操作最最最最简单实例
python从入门到大神---4.python3文件操作最最最最简单实例 一.总结 一句话总结: python文件操作真的很简单,直接在代码中调用文件操作的函数比如open().read(),无需引包 ...
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- Python 正则表达式入门(初级篇)
Python 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
随机推荐
- javascript数组 (转)
javascript的Array可以包含任意数据类型,并通过索引来访问每个元素. 要取得Array的长度,直接访问length属性: var arr = [1,2,3.14,'Hell0' ...
- 剑指 Offer 12. 矩阵中的路径
题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...
- 第九章 身体质量指数BMI的python实现
身体质量指数BMI:对身体质量的刻画(Body Mass Index) 国际上常用的衡量人体肥胖和健康程度的重要标准,主要用于统计分析 定义: BMI=体重(kg)/身高^2(m2) 提出问题: 实例 ...
- WPF教程六:理解WPF中的隧道路由和冒泡路由事件
WPF中使用路由事件升级了传统应用开发中的事件,在WPF中使用路由事件能更好的处理事件相关的逻辑,我们从这篇开始整理事件的用法和什么是直接路由,什么是冒泡路由,以及什么是隧道路由. 事件最基本的用法 ...
- Java和C#语法对比(转)
Java C# 访问修饰符 public 修饰类.接口.变量.方法. 对所有类可见. 修饰类.接口.变量.方法. 对所有类可见. internal 无. 修饰类.接口.变量.方法. 类,接 ...
- 洛谷 P4402 BZOJ1552 / 3506 [Cerc2007]robotic sort 机械排序
FHQ_Treap 太神辣 蒟蒻初学FHQ_Treap,于是来到了这道略显板子的题目 因为Treap既满足BST的性质,又满足Heap的性质,所以,对于这道题目,我们可以将以往随机出的额外权值转化为每 ...
- R绘图(7): 把散点图的点换成扇形
前几天分析了一批单细胞TCR的数据,需要画这样一个图: 行是不同的样本,列是不同的T细胞类型,每一个位置点的大小表示T细胞的数目多少,并且还需要根据T细胞所属的克隆型类型涂色.这个图用来描述TCR是我 ...
- springMVC-2-MVC初步了解
Spring MVC的特点 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼容性好,无缝结合 约定优于配置 功能强大:RESTful.数据验证.格式化.本地化.主题等 简洁灵活 ...
- CF1032G Chattering
CF1032G Chattering 题意 思路 对于每一个位置,它转移的范围是确定的. 对于一段可以走到的区间,我们可以求出区间中所有点再能走到区间范围. 于是这个就可以倍增进行转移. 如何快速求出 ...
- P3209-平面图判定
平面图 平面图就是所有点的连边不相交的图.(当然是在你尽量想让它不相交的情况下).这一点可以大概理解成拓扑图的性质,即每连一条边就会将某个区域进行分割--很明显,如果两个点分别处在两个不可达的区域,它 ...