1. 程式人生 > 其它 >python進階(22)pydantic--資料型別校驗

python進階(22)pydantic--資料型別校驗

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丿丶黑羽'

這裡的 userUser 的一個例項。物件的初始化會執行所有解析和驗證,如果沒有引發 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

模型的配置類(後續更新)