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丿丶黑羽'

这里的 userUser 的一个实例。对象的初始化会执行所有解析和验证,如果没有引发 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--数据类型校验的更多相关文章

  1. Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束

    Python进阶----数据库引擎(InnoDB),表的创建,mysql的数据类型,mysql表的约束 一丶MySQL的存储引擎 什么是存储引擎:    MySQL中的数据用各种不同的技术存储在文件( ...

  2. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  3. Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型)

    Python进阶(十)----软件开发规范, time模块, datatime模块,random模块,collection模块(python额外数据类型) 一丶软件开发规范 六个目录: #### 对某 ...

  4. python进阶篇

    python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. ​ import sys ...

  5. Python进阶(一)----函数

    Python进阶(一)----函数初识 一丶函数的初识 什么函数: ​ 函数是以功能为导向.一个函数封装一个功能 函数的优点: ​ 1.减少代码的重复性, ​ 2.增强了代码的可读性 二丶函数的结构 ...

  6. python进阶资源

    本文为不同阶段的Python学习者从不同角度量身定制了49个学习资源. 初学者 Welcome to Python.org https://www.python.org/ 官方Python站点提供了一 ...

  7. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. Python 进阶(五)定制类

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAF/CAIAAACUs6uhAAAgAElEQVR4nOzdZXubx7ov8PPV9tlrt0 ...

  9. python进阶学习笔记(一)

    python进阶部分要学习的内容: 学习目标: 1.函数式编程 1.1,什么是函数式编程 函数式编程是一种抽象计算的编程模式 不同语言的抽象层次不同: 函数式编程的特点: python支持的函数式编程 ...

  10. 【python进阶】详解元类及其应用2

    前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...

随机推荐

  1. 反转链表middle

    eg: 输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]相关解法:图解: /** * Definition for singly-li ...

  2. Jmeter系列(7)- 分析源码,创建下单、用户注销接口请求

    源码分析 下单 用户注销 创建请求 下单 用户注销 请求调整 将信息头管理器从[02.浏览订单]请求中抽出来就变成公用的.[03,04]请求不需要单独再加信息头管理器 DeBug取样器 添加DeBug ...

  3. spy++查找窗口句柄

    spy++可以用来查找桌面程序(c/s)的窗口句柄,实现自动化测试. def find_idxSubHandle(pHandle, winClass, index=0): ""&q ...

  4. 鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅 | 百篇博客分析OpenHarmony源码 | v37.03

    百篇博客系列篇.本篇为: v37.xx 鸿蒙内核源码分析(系统调用篇) | 开发者永远的口头禅 | 51.c.h .o 任务管理相关篇为: v03.xx 鸿蒙内核源码分析(时钟任务篇) | 触发调度谁 ...

  5. P5319-[BJOI2019]奥术神杖【0/1分数规划,AC自动机,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5319 题目大意 一个长度为\(n\)的串\(T\),用\(0\sim 9\)填充所有的\(.\). 然后给出\( ...

  6. 使用Golang搭建gRPC服务提供给.NetCore客户端调用

    目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编译器 ...

  7. 高中最后一刻&大学第一课&为人师的责任

    文章不是技术文,只是分享一些感想,作为一只程序猿,不说好好敲代码,跑出来思考人生,不是合格的程序猿,罪过罪过,自我反思3秒钟,我们继续,毕竟程序猿的人生不只是Coding,也希望自己这点感想被更多刚入 ...

  8. NOI 2017 Day1 题解

    被虐爆了... T1 整数 题目传送门 Description 有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况: 给出 \(a,b\),将 \(x\) 加上 \(a\times ...

  9. C程序内存布局

    作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 . C程序的内存布局包含五个段,分别是STACK(栈段), ...

  10. springcloud(二) 微服务架构编码构建

    微服务架构编码构建 1 基础知识 1.1 版本 2 微服务cloud整体聚合父工程Project 2.1 new project 2.2 字符编码设置 utf-8 2.3 pom.xml 2.4 父工 ...