什么是Pydantic
- Pydantic 是一个 Python 库,主要用于数据验证和设置管理。它使用 Python 的类型提示(type hints)来定义数据的结构,并在运行时验证数据是否符合定义的结构。简单来说,它可以确保数据的准确性和完整性,帮助开发人员在早期发现数据相关的问题。
- 例如,在处理用户输入、API 响应或者配置文件时,Pydantic 可以验证数据的格式、类型和取值范围等是否正确
用法总结
数据定义和实例化
1.定义
pydantic库的数据定义方式是通过BaseModel类来进行定义的,它最基本的使用方式如下:
from pydantic import BaseModel
class TestCase(BaseModel):
method: str
2.实例化
参数传递
ts = TestCase(method="GET")
关键字参数
t = {"methos": "GET"}
TestCase(**t)
注意
- 如果传参有误,pydantic会抛错
ValidationError: 1 validation errors for Person
url
field required (type=value_error.missing)
- 如果传入值多于定义值时,BaseModel也会自动对其进行过滤。
- pydantic在数据传输时会直接进行数据类型转换,因此,如果数据传输格式错误,但是可以通过转换变换为正确的数据类型是,数据传输也可以成功.
基本数据类型
from pydantic import BaseModel
from typing import Text, Dict, List, Sequence, Set, Tuple
class Demo(BaseModel):
a: int # 整型
b: float # 浮点型
c: str # 字符串
d: bool # 布尔型
e: List[int] # 整型列表
f: Dict[str, int] # 字典型,key为str,value为int
g: Set[int] # 集合
h: Tuple[str, int] # 元组
高级数据类型
enum
Enum数据类型在enum库中
from enum import Enum
class Gender(str, Enum):
man = "man"
women = "women"
Optional
如果一个数据类型不是必须的,可以允许用户在使用中不进行传入,则我们可以使用typing库中的Optional方法进行实现。
from typing import Optional
from pydantic import BaseModel
class Person(BaseModel):
name: str
age: Optional[int]
数据默认值的设置
上述可选数据类型方法事实上是一种较为特殊的给予数据默认值的方法,只是给其的默认值为None。这里,我们给出一些更加一般性的给出数据默认值的方法。其实现方式也极其简单,下面,我们直接给出例子如下:
from pydantic import BaseModel
class Person(BaseModel):
name: str
gender: str = "man"
p = Person(name="Tom")
print(p.json()) # {"name": "Tom", "gender": "man"}
Union
如果一个数据可以允许多种数据类型,我们可以通过typing库中的Union方法进行实现。
from typing import Union
from pydantic import BaseModel
class Time(BaseModel):
time: Union[int, str]
t = Time(time=12345)
print(t.json()) # {"time": 12345}
t = Time(time = "2020-7-29")
print(t.json()) # {"time": "2020-7-29"}
Field
假设我们之前已经定义了一个schema,将其中某一个参量命名为了A,但是在后续的定义中,我们希望这个量被命名为B,要如何完成这两个不同名称参量的相互传递
from pydantic import BaseModel, Field
class Password(BaseModel):
password: str = Field(alias = "key")
多级schema定义样例
from enum import Enum
from typing import List, Union
from datetime import date
from pydantic import BaseModel
class Gender(str, Enum):
man = "man"
women = "women"
class Person(BaseModel):
name : str
gender : Gender
class Department(BaseModel):
name : str
lead : Person
cast : List[Person]
class Group(BaseModel):
owner: Person
member_list: List[Person] = []
class Company(BaseModel):
name: str
owner: Union[Person, Group]
regtime: date
department_list: List[Department] = []
数据检查方法
validator
import re
from pydantic import BaseModel, validator
class Password(BaseModel):
password: str
@validator("password")
def password_rule(cls, password):
def is_valid(password):
if len(password) < 6 or len(password) > 20:
return False
if not re.search("[a-z]", password):
return False
if not re.search("[A-Z]", password):
return False
if not re.search("\d", password):
return False
return True
if not is_valid(password):
raise ValueError("password is invalid")
config
from pydantic import BaseModel
class Password(BaseModel):
password: str
class Config:
min_anystr_length = 6 # 令Password类中所有的字符串长度均要不少于6
max_anystr_length = 20 # 令Password类中所有的字符串长度均要不大于20
参考
https://blog.youkuaiyun.com/swinfans/article/details/89629641