pydantic庫的作用
pydantic
庫是一種常用的用於數據接口schema
定義與檢查的庫。Pydantic
在運行時強制執行類型提示,並在數據無效時提供用戶友好的錯誤信息。
pydantic安裝
pip install pydantic
用法詳解
模型
- 在
pydantic
中定義對象的主要方法是通過模型(模型是繼承自BaseModel
的類)。 - 將模型看作嚴格類型語言中的類型(例如Java),或者看作API中單個端點的需求。
- 不受信任的數據可以傳遞給模型,在解析和驗證之后,
pydantic
保證結果模型實例的字段將符合模型上定義的字段類型。
注意事項
pydantic
是一個解析庫,而不是一個驗證庫。- 驗證是達到目的的一種手段:構建符合所提供的類型和約束的模型。
- 換句話說,
pydantic
保證輸出模型的類型和約束,而不是輸入數據。
基礎模型使用
from pydantic import BaseModel
class User(BaseModel):
id: int
name = "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
模型的配置類(后續更新)