建设网站的整个费用预算,做网站分几步,cms网站建站流程,遵义网络科技有限公司1. 简介
pydantic 库是一种常用的用于数据接口 schema 定义与检查的库。 通过 pydantic 库#xff0c;我们可以更为规范地定义和使用数据接口#xff0c;这对于大型项目的开发将会更为友好。 当然#xff0c;除了 pydantic 库之外#xff0c;像是 valideer 库、marshmallo…1. 简介
pydantic 库是一种常用的用于数据接口 schema 定义与检查的库。 通过 pydantic 库我们可以更为规范地定义和使用数据接口这对于大型项目的开发将会更为友好。 当然除了 pydantic 库之外像是 valideer 库、marshmallow 库、trafaret 库以及 cerberus 库等都可以完成相似的功能但是相较之下pydantic 库的执行效率会更加优秀一些。 因此这里我们仅针对 pydantic 库来介绍一下如何规范定义标准 schema 并使用。
安装部署
pip install pydantic2. 使用方法
2.1. schema 基本定义
pydantic 库的数据定义方式是通过 BaseMode l类来进行定义的所有基于pydantic的数据类型本质上都是一个BaseModel类它最基本的使用方式如下
from pydantic import BaseModelclass Person(BaseModel):name: str2.2. schema 基本实例化
调用时我们只需要对其进行实例化即可实例化方法有以下几种 直接传值
p Person(nameTom)
print(p.json()) # {name: Tom}通过字典传入
p {name: Tom}
p Person(**p)
print(p.json()) # {name: Tom}通过其他的实例化对象传入
p2 Person.copy(p)
print(p2.json()) # {name: Tom}2.3. 异常处理
当传入值错误的时候pydantic就会抛出报错例如
Person(personTom) # 定义为name而非personpydantic会抛出异常
ValidationError: 1 validation errors for Person
namefield required (typevalue_error.missing)2.4. 参数过滤
另一方面如果传入值多于定义值时BaseModel 也会自动对其进行过滤。如
p Person(nameTom, genderman, age24)
print(p.json()) # {name: Tom}可以看到额外的参数 gender 与 age 都被自动过滤了。 通过这种方式数据的传递将会更为安全但是同样的这也要求我们在前期的 schema 定义中必须要尽可能地定义完全。
2.5. 阴性类型转换
此外pydantic 在数据传输时会直接进行数据类型转换因此如果数据传输格式错误但是可以通过转换变换为正确的数据类型是数据传输也可以成功例如
p Person(name123)
print(p.json()) # {name: 123}3. pydantic 数据类型
3.1. 基本数据类型
下面我们来看一下pydantic中的一些常用的基本类型。
from pydantic import BaseModel
from typing import Dict, List, Sequence, Set, Tupleclass Demo(BaseModel):a: int # 整型b: float # 浮点型c: str # 字符串d: bool # 布尔型e: List[int] # 整型列表f: Dict[str, int] # 字典型key为strvalue为intg: Set[int] # 集合h: Tuple[str, int] # 元组3.2. 高级数据结构
这里我们给出一些较为复杂的数据类型的实现。
3.2.1. enum 数据类型
enum型数据类型我们可以通过enum库进行实现给出一个例子如下
from enum import Enumclass Gender(str, Enum):man manwomen women3.2.2. 可选数据类型
如果一个数据类型不是必须的可以允许用户在使用中不进行传入则我们可以使用typing库中的Optional方法进行实现。
from typing import Optional
from pydantic import BaseModelclass Person(BaseModel):name: strage: Optional[int]需要注意的是设置为可选之后数据中仍然会有age字段但是其默认值为None即当不传入age字段时Person仍然可以取到age只是其值为None。例如
p Person(nameTom)
print(p.json()) # {name: Tom, age: None}3.2.3. 数据默认值
上述可选数据类型方法事实上是一种较为特殊的给予数据默认值的方法只是给其的默认值为None。这里我们给出一些更加一般性的给出数据默认值的方法。
from pydantic import BaseModelclass Person(BaseModel):name: strgender: str manp Person(nameTom)
print(p.json()) # {name: Tom, gender: man}3.2.4. 允许多种数据类型
如果一个数据可以允许多种数据类型我们可以通过 typing 库中的 Union 方法进行实现。
from typing import Union
from pydantic import BaseModelclass Time(BaseModel):time: Union[int, str]t Time(time12345)
print(t.json()) # {time: 12345}
t Time(time 2020-7-29)
print(t.json()) # {time: 2020-7-29}3.2.5. 异名数据传递
假设我们之前已经定义了一个schema将其中某一个参量命名为了A但是在后续的定义中我们希望这个量被命名为B要如何完成这两个不同名称参量的相互传递呢 我们可以通过 Field 方法来实现这一操作。
from pydantic import BaseModel, Fieldclass Password(BaseModel):password: str Field(alias key)则在传入时我们需要用key关键词来传入password变量。
p Password(key123456)
print(p.json()) # {password: 123456}3.2.6. 多级 schema 定义
这里我们给出一个较为复杂的基于pydantic的schema定义实现样例。
from enum import Enum
from typing import List, Union
from datetime import date
from pydantic import BaseModelclass Gender(str, Enum):man manwomen womenclass Person(BaseModel):name : strgender : Genderclass Department(BaseModel):name : strlead : Personcast : List[Person]class Group(BaseModel):owner: Personmember_list: List[Person] []class Company(BaseModel):name: strowner: Union[Person, Group]regtime: datedepartment_list: List[Department] []需要注意的是我们除了可以一步一步地实例化之外如果我们已经有了一个完整的Company的内容字典我们也可以一步到位地进行实例化。
sales_department {name: sales,lead: {name: Sarah, gender: women},cast: [{name: Sarah, gender: women},{name: Bob, gender: man},{name: Mary, gender: women}]
}research_department {name: research,lead: {name: Allen, gender: man},cast: [{name: Jane, gender: women},{name: Tim, gender: man}]
}company {name: Fantasy,owner: {name: Victor, gender: man},regtime: 2020-7-23,department_list: [sales_department,research_department]
}company Company(**company)3.3. 数据检查
pydantic 本身提供了上述基本类型的数据检查方法但是除此之外我们也可以使用 validator 和 config 方法来实现更为复杂的数据类型定义以及检查。
3.3.1. validator用法
使用validator方法我们可以对数据进行更为复杂的数据检查。
import re
from pydantic import BaseModel, validatorclass Password(BaseModel):password: strvalidator(password)def password_rule(cls, password):def is_valid(password):if len(password) 6 or len(password) 20:return Falseif not re.search([a-z], password):return Falseif not re.search([A-Z], password):return Falseif not re.search(\d, password):return Falsereturn Trueif not is_valid(password):raise ValueError(password is invalid)通过这种方式我们就可以额外对密码类进行格式要求对其字符数以及内部字符进行要求。
3.3.2. Config 方法
如果要对BaseModel中的某一基本型进行统一的格式要求我们还可以使用Config方法来实现。
from pydantic import BaseModelclass Password(BaseModel):password: strclass Config:min_anystr_length 6 # 令Password类中所有的字符串长度均要不少于6max_anystr_length 20 # 令Password类中所有的字符串长度均要不大于204. 模型属性
dict() 模型字段和值的字典 json() JSON 字符串表示dict() copy() 模型的副本默认为浅表副本 parse_obj() 使用dict解析数据 parse_raw 将str或bytes并将其解析为json然后将结果传递给parse_obj parse_file 文件路径读取文件并将内容传递给parse_raw。如果content_type省略则从文件的扩展名推断 from_orm() 从ORM 对象创建模型 schema() 返回模式的字典 schema_json() 返回该字典的 JSON 字符串表示 construct() 允许在没有验证的情况下创建模型 fields_set 初始化模型实例时设置的字段名称集 fields 模型字段的字典 config 模型的配置类
参考 https://blog.csdn.net/codename_cys/article/details/107675748 https://www.cnblogs.com/dyl0/articles/16896330.html