pydantic
库是一种常用的用于数据接口schema
定义与检查的库。Pydantic
在运行时强制执行类型提示,并在数据无效时提供用户友好的错误信息。pip install pydantic
pydantic
中定义对象的主要方法是通过模型(模型是继承自 BaseModel
的类)。pydantic
保证结果模型实例的字段将符合模型上定义的字段类型。注意事项
pydantic
是一个解析库,而不是一个验证库。pydantic
保证输出模型的类型和约束,而不是输入数据。from pydantic import BaseModel class User(BaseModel): id: int name = "Silent丿丶黑羽"
为什么name字段不需要声明类型
user = User(id="123") print(type(user)) # <class '__main__.User'> print(user) # id=123 name='Silent丿丶黑羽'
这里的 user
是 User
的一个实例。对象的初始化会执行所有解析和验证,如果没有引发 ValidationError
异常,则表明结果模型实例是有效的。
这里我们传入了的id是一个字符串,但实际打印出来却是整型,是因为pydantic
在数据传输时会直接进行数据转换
模型有多个属性和方法,我们依次介绍
返回模型的字段和值的字典
user = User(id=123) print(user.dict()) # {'id': 123, 'name': 'jkc'} print(type(user.dict())) # <class 'dict'>
返回表示 dict()
的 JSON
字符串
user = User(id=123) print(user.json()) # {"id": 123, "name": "jkc"} print(type(user.json())) # <class 'str'>
返回模型的拷贝,默认是浅拷贝
user = User(id=123) print(user.copy()) # id=123 name='jkc'
这与模型的_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错误
&
用于加载多种格式字符串的实用程序
user = User(id=123) print(user.parse_raw('{"id": 3, "name": "jkc"}')) # id=3 name='jkc'
与 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'
返回以 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'>
返回以 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'>
返回用户初始化对象时提供了什么字段
user = User(id=123) print(user.__fields_set__) # {'id'} user = User(id=123, name="jkc") print(user.__fields_set__) # {'name', 'id'}
模型的配置类(后续更新)