1.pydantic简介
pydantic是一种用于数据接口schema定义与检查的库。
通过pydantic库,我们可以更规范地定义和使用接口,这对大型项目的开发将会更友好。除了pydantic库以外,valideer库、marshmallow库、trafaret库以及cerberus库等都可以完成相似的功能。
2.pydantic用法
在pydantic中主要是通过模型(继承BaseModel的类)来定义对象,可以将该模型看作是严格类型语言中的类型。使用时,将你觉得有可能会出问题的数据传递给模型,在解析验证后,可以保证模型实例对象中的各个字段符合模型中相应字段的定义。
这里值得注意,pydantic主要是一种对输出的数据进行类型规则检查和约束的解析库。对于输入数据不做保证。
2.1 基本的schema定义方法
pydantic库的数据定义方式是通过BaseModel类来进行的, 所有基于pydantic的数据类型本质上都是一个BaseModel类。它最基本用法如下:
from pydantic import BaseModel
class Person(BaseModel):
name: str
2.2基本的schema实例化方法
2.2.1 直接传值
p = Person(name='Tom')
print(p.json())
result:
{"name": "Tom"}
2.2.2 通过字典传入
p = Person(**{'name':'Tom'})
print(p.json())
result:
{"name": "Tom"}
2.2.3 通过其他的实例化对象传入
p = Person(name='Tom')
p2 = Person.copy(p)
print(p2.json())
result:
{"name": "Tom"}
2.2.4 特殊情形
2.2.4.1 当传入的值错误时,pydantic就会抛出异常
print(Person(names='Tom').json())
result:
pydantic.error_wrappers.ValidationError: 1 validation error for Person
name
field required (type=value_error.missing)
2.2.4.2 当传入的值多余定义的值时,pydantic会自动对其进行过滤
p = Person(name='Tom', age=24)
print(p.json())
result:
{"name": "Tom"}
通过这种方式,数据的传递将会更为安全。但是这就要求我们在前期的schema定义中必须要尽可能的定义完全。
2.2.4.3 pydantic在数据传输时会进行类型转换
p = Person(name=24)
print(p.json())
result:
{"name": "24"}