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 正则表达式入门(初级篇) 本文主要为没有使用正则表达式经验的新手入门所写. 转载请写明出处 引子 首先说 正则表达式是什么? 正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达 ...
随机推荐
- SpringMVC(2)经典的HelloWorld实现
我机器的开发环境为: Ubuntu12.04(不同操作系统对本系列项目没有影响): 开发工具:Eclipse For JavaEE: 数据库:MySql5.5.35; 运行环境:TomCat V7.0 ...
- 22 shell组命令与子进程
1.组命令 2.子进程 2.1 什么是子进程 2.2 创建子进程 2.3 子进程总结 3.如何检测子shell与子进程 1.组命令 组命令,就是将多个命令划分为一组,或者看成一个整体. 用法 区别 S ...
- js代码 简单实现数字滚动增加动效(原)
<html><body> <span>look this:</span><span id="nums">10000< ...
- 全彩LED灯
1.全彩 LED 灯,实质上是一种把红.绿.蓝单色发光体集成到小面积区域中的 LED 灯,控制时对这三种颜色的灯管输出不同的光照强度,即可混合得到不同的颜色,其混色原理与光的三原色混合原理一致.例如, ...
- 关闭火狐浏览器中的Pocket功能
在火狐(Firefox)浏览器中,默认右键菜单和菜单栏都会有 Pocket按钮 .但是大部分国内用户都不会使用Pocket服务,看着还十分碍眼. 在工具栏的图标还可以通过定制工具栏修改,但是右键菜单中 ...
- python正则表达式应用
import re ab='''ms: [["", "\u7acb\u5373\u4e0b\u8f7d"], ["", "\u52 ...
- 高校表白App-团队冲刺第七天
今天要做什么 使用Fragment进行分屏处理,制作底层 做了什么 完成任务 遇到的问题 因为以前做过了一个,所以这次没有遇到什么问题,开心.啊哈哈
- POJ 树的直径和重心
树的直径:(无根)树上最长两点间的最长路径,两次dfs即可,第一次dfs任选一点u,找到距离它最远的点s,再从点s进行一次dfs,找到距离s最远的点t,则s-t之间的路径就是树的直径.证明: < ...
- Spark—local模式环境搭建
Spark--local模式环境搭建 一.Spark运行模式介绍 1.本地模式(loca模式):spark单机运行,一般用户测试和开发使用 2.Standalone模式:构建一个主从结构(Master ...
- 基于 apache-arrow 的 duckdb rust 客户端
背景 duckdb 是一个 C++ 编写的单机版嵌入式分析型数据库.它刚开源的时候是对标 SQLite 的列存数据库,并提供与 SQLite 一样的易用性,编译成一个头文件和一个 cpp 文件就可以在 ...