首页 > 编程语言 >Pydantic:强大的Python 数据验证库

Pydantic:强大的Python 数据验证库

时间:2024-02-26 11:11:42浏览次数:34  
标签:name 验证 Python Field length User email Pydantic

Pydantic

Pydantic 是一个在 Python 中用于数据验证和解析的第三方库。它提供了一种简单且直观的方式来定义数据模型,并使用这些模型对数据进行验证和转换。

Pydantic 的一些主要特性:

  1. 类型注解:Pydantic 使用类型注解来定义模型的字段类型。你可以使用 Python 内置的类型、自定义类型或者其他 Pydantic 提供的验证类型。
  2. 数据验证:Pydantic 自动根据模型定义进行数据验证。它会检查字段的类型、长度、范围等,并自动报告验证错误。你可以使用 ValidationError 异常来捕获验证错误。
  3. 模型转换:Pydantic 提供了从各种数据格式(例如 JSON、字典)到模型实例的转换功能。它可以自动将输入数据解析成模型实例,并保留类型安全性和验证规则。

Pydantic 使用前需要先进行安装。

pip install pydantic

Pydantic 基本操作

使用 Pydantic,可以定义一个模型类,该类需要继承 pydantic 中的 BaseModel 类,模型类描述了数据的结构和类型,并指定验证规则。

然后,可以使用这个模型类来验证输入的数据是否符合预期,并以类型安全的方式访问和操作数据。

from pydantic import BaseModel, ValidationError
class User(BaseModel):    
    name: str    
    age: int    
    email: str
try:    
    user = User(name="Alice", age="30", email="[email protected]") 
except ValidationError as e:    
    print(e.json())

如果创建实例的数据不符合类型注解的要求,则会报 ValidationError 错误。

Pydantic 高级操作

Pydantic 还可以结合 typing 模块,进行默认值,可选字段属性等验证的高级操作。甚至还可以通过 EmailStr 类来直接验证邮件正确性,但该类依赖一个第三方模块,在使用前需要使用 pip install email-validator 进行安装后才可以使用。

from typing import Optional
from pydantic import BaseModel, EmailStr
class User(BaseModel):    
    name: str    
    age: int    
    email: EmailStr    
    phone: Optional[str] = None

user = User(name="Alice", age=30, email="[email protected]")  # 有效
user = User(name="Alice", age=30, email="invalid_email")  # 错误:无效的电子邮件

Field 对象

Field函数提供了许多参数来定制字段的行为。以下是一些常用的参数:

  • ...:表示该字段是必填项。
  • default:定义字段的默认值。如果未提供该值,则默认为None,不能与 ... 同时使用。
  • min_lengthmax_length:针对字符串类型的字段定义最小和最大长度限制。
  • gtgeltle:针对数值类型的字段定义大于 gt、大于等于 ge、小于 lt 和小于等于 le 的限制。
from pydantic import BaseModel, EmailStr, ValidationError, Field
class User(BaseModel):    
    name: str = Field(..., min_length=1, max_length=10)    
    age: int = Field(..., ge=0, le=200)    
    email: EmailStr    
    phone: str = Field(default="13800138000", min_length=11, max_length=11)
user = None
try:    
    user = User(name="Tom", age=22, email="[email protected]")
except ValidationError as e:    
    a = eval(e.json())    
    print(a[0]["msg"])
finally:    
    print(user)

数据转换

通过定义模型类,可以将通过网络传输或数据库查询的数据转换成模型类对象在程序中使用。

反之,也可以将处理过后的模型类对象转换成对应的字典或 JSON 数据进行存储或传输。

模型类转换为字典

使用 模型类.model_dump() 方法可以将一个模型类实例对象转换为字典类型数据。

from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):    
    name: str = Field(..., min_length=1, max_length=10)    
    age: int = Field(..., ge=0, le=200)    
    email: EmailStr    
    phone: str = Field(default="13800138000", min_length=11, max_length=11)
user = User(name="Tom", age=22, email="[email protected]")
data = User.model_dump(user)
print(data)
print(type(data))

模型类转换为JSON

使用 模型类.model_dump_json() 方法可以将一个模型类实例对象转换为 JSON 字符串。

from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):    
    name: str = Field(..., min_length=1, max_length=10)    
    age: int = Field(..., ge=0, le=200)    
    email: EmailStr    
    phone: str = Field(default="13800138000", min_length=11, max_length=11)
user = User(name="Tom", age=22, email="[email protected]")
data = User.model_dump_json(user)
print(data)
print(type(data))

获取更多软件测试技术资料/面试题解析,请点击!

标签:name,验证,Python,Field,length,User,email,Pydantic
From: https://www.cnblogs.com/hogwarts/p/18033894

相关文章

  • leedcode 验证回文串
    自己写的:classSolution:defisPalindrome(self,s:str):#将字符串转换为小写,以便进行大小写不敏感的比较s_lower=s.lower()#获取字符串的长度n=len(s_lower)#创建一个空列表,用于存储字母和数字......
  • python如何将自定义目录添加到sys.path中,如何将自定义目录从sys.path中删除
    python如何将自定义目录添加到sys.path中,如何将自定义目录从sys.path中删除背景:在python脚本中,经常需要将自定义的包导入当前脚本,但该包并非pip安装,不在sys.path中,无法直接导入,所以需要临时导入自定义包;另外有时候将自定义的包永久写入了sys.path后,但实际又用不到该包,需要将自定......
  • [oeasy]python0008_输出h字符_REPL_引号_括号_什么是函数
    输出h字符_REPL_引号_括号_什么是函数......
  • 取消浏览器中记住密码自动填充时弹出Windows安全中心的验证
    1、......
  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • python——面向对象——知识汇总二
    Pythonproperty()函数:定义属性 我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。 正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。因此,在不破坏类封装原则的基础上,为了能......
  • Python数据结构与算法05——二分查找
    二分查找——递归版:defbinarySearch(aimlist,item):#获取列表的长度n=len(aimlist)#如果列表非空ifn>0:#计算中间索引mid=n//2#如果中间元素是目标元素,则找到了ifaimlist[mid]==item:......
  • 加速Python代码的秘密武器,探索Cython的秘密
    首先和大家明确一下这个Cython单词的读法,这个单词Cython以前我也不知道怎么读,老后面要用到这个包的时候,老是不清楚读法,才去搜了下,这个单词是读"赛森",就是前面的cy是读"赛",后面的读法和python后一个读音thon一样。Cython是什么Cython是一个用于将Python代码转换为C或C++代码的编......
  • 测试工程师常用的python库
    大家好,今天给各位小伙伴带来的是测试工程师常用的10个python库,相信有些小伙伴肯定知道一些库,也使用过一些库。下面我们就来聊聊这常用的10个python库,我们主要介绍这些库和这些库的一些应用场景,方便没有接触过的小伙伴知道这些库的作用。个人认为以下10个库是测试工程师最常用的库......
  • 常用的Python代码片段(绘图)
    Proplot绘制具有经纬网的地图importproplotasppltimportcartopyfig,ax=pplt.subplots(proj=['cyl'],ncols=1,nrows=1)ax.add_feature(cartopy.feature.COASTLINE)ax.add_feature(cartopy.feature.BORDERS,linestyle=':',linewidth=0.5)ax.add_featu......