python進階(22)pydantic--資料型別校驗
阿新 • • 發佈:2021-11-03
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
模型的配置類(後續更新)