pydantic库的作用
-
pydantic
库是一种常用的用于数据接口
schema
定义与检查的库。
-
Pydantic
在运行时强制执行类型提示,并在数据无效时提供用户友好的错误信息。
pydantic安装
pip install pydantic
用法详解
模型
- 在
pydantic
中定义对象的主要方法是通过模型(模型是继承自
BaseModel
的类)。
- 将模型看作严格类型语言中的类型(例如Java),或者看作API中单个端点的需求。
- 不受信任的数据可以传递给模型,在解析和验证之后,
pydantic
保证结果模型实例的字段将符合模型上定义的字段类型。
注意事项
-
pydantic
是一个解析库,而不是一个验证库。
- 验证是达到目的的一种手段:构建符合所提供的类型和约束的模型。
- 换句话说,
pydantic
保证输出模型的类型和约束,而不是输入数据。
基础模型使用
from pydantic import BaseModelclass User(BaseModel):id: intname = "Silent丿丶黑羽"
- User这是一个有两个字段的模型
- id是一个整型,必填项
- name是一个有默认值的字符串,不是必填项
为什么name字段不需要声明类型
- name 的类型是从其默认值推断来的,因此,类型注解不是必需的
- 有些字段没有指定类型,可能会引发字段顺序的警告
user = User(id="123")print(type(user)) # <class \'__main__.User\'>print(user) # id=123 name=\'Silent丿丶黑羽\'
这里的
user
是
User
的一个实例。对象的初始化会执行所有解析和验证,如果没有引发
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
模型的配置类(后续更新)