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 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
随机推荐
- 在使用XStream时没有processAnnotations方法
https://stackoverflow.com/questions/28770909/xstream-processannotations 我遇到这个问题的原因是xstream.jar的版本问题 ...
- Adaptive AUTOSAR 学习笔记 1 - Overview
缩写 AP: AUTOSAR Adaptive Platform CP: AUTOSAR Classic Platform AA: Adaptive Application ARA: AUTOSAR ...
- 机器学习Sklearn系列:(三)决策树
决策树 熵的定义 如果一个随机变量X的可能取值为X={x1,x2,..,xk},其概率分布为P(X=x)=pi(i=1,2,...,n),则随机变量X的熵定义为\(H(x) = -\sum{p(x)l ...
- ARC 122 简要题解
ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...
- LOJ528 「LibreOJ β Round #4」求和
LOJ528 「LibreOJ β Round #4」求和 先按照最常规的思路推一波: \[\begin{aligned} &\sum_{i=1}^n\sum_{j=1}^m\mu^2(\gc ...
- mysql中函数cast使用
CAST函数语法规则是:Cast(字段名 as 转换的类型 ),其中类型可以为: CHAR[(N)] 字符型DATE 日期型DATETIME 日期和时间型DECIMAL float型SIGNED in ...
- python使用笔记007-内置函数,匿名函数
1.匿名函数 匿名函数也是一个函数,是一个简单的函数,没有名字,只能实现一些简单的功能 1 #匿名函数也是一个函数,是一个简单的函数,没有名字,只能实现一些简单的功能 2 lambda x:x+1#入 ...
- Linux下面向TCP连接的C++ Socket编程实例
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...
- Rust安装-运行第一个程序-hello_world
Rust官网:https://rust-lang.org/ 安装 点击install,选择版本 选择相对应的版本进行下载 我这里下载的是windows系统,运行下载好的exe文件,根据需要选择选对应的 ...
- hadoop源码_hdfs启动流程_3_心跳机制
hadoop在启动namenode和datanode之后,两者之间是如何联动了?datanode如何向namenode注册?如何汇报数据?namenode又如何向datanode发送命令? 心跳机制基 ...