前言
版本文檔:v1.9.0
使用 python 類型注釋的數據驗證和設置管理。
pydantic在運行時強制執行類型提示,並在數據無效時提供用戶友好的錯誤。
定義數據應該如何在純粹的、規范的 python 中;並使用 pydantic 對其進行驗證。
pydantic 簡介
pydantic 主要是一個解析庫,而不是驗證庫。
驗證是達到目的的一種手段:建立一個符合所提供的類型和約束的模型。
換句話說,pydantic 保證輸出模型的類型和約束,而不是輸入數據。
這聽起來像是一個深奧的區別,但事實並非如此。如果您不確定這意味着什么或它可能如何影響您的使用,您應該閱讀下面有關數據轉換的部分。
雖然驗證不是 pydantic 的主要目的,但您可以使用此庫進行自定義驗證。
環境安裝
python3.6+版本都可以直接pip安裝使用
pip install pydantic
目前版本是v1.9.0
簡單示例
當我們定義一個user對象的時候,它有id,name,birth,friends等屬性.在pydantic中定義對象的主要方法是通過模型(模型繼承自 BaseModel 的類)。
- id 是一個字符串類型
- name 也是字符串
- birth 是生日,是一個日期類datetime
- friends 是一個列表,列表里面是user的id
代碼示例
from datetime import datetime
from typing import List, Optional
from pydantic import BaseModel
class User(BaseModel):
id: int
name = 'yo yo'
birth: Optional[datetime] = None
friends: List[int] = []
external_data = {
'id': '123',
'birth': '2019-06-01 12:22',
'friends': [1, 2, '3'],
}
user = User(**external_data)
print(user.dict()) # dict() 函數將對象轉化成字典
運行結果
{'id': 123, 'birth': datetime.datetime(2019, 6, 1, 12, 22), 'friends': [1, 2, 3], 'name': 'yo yo'}
運行過程中發生了什么?
在整個運行的過程中發生了什么?
先實例化 user = User(**external_data) 傳入了external_data,以關鍵字參數傳入,等價於
user = User(
id='123',
birth='2019-06-01 12:22',
friends=[1, 2, '3']
)
id 是 int 類型;注釋聲明告訴pydantic該字段是必須的。如果可能,字符串、字節或浮點數將強制轉換為int,否則將引發異常。
name 從默認值推斷為其為 str 類型,該字段不是必須的,因為它有默認值。
birth 是 datetime 類型,該字段不是必須的,默認值為 None。pydantic會將表示unix時間戳(例如1496498400)的 int 類型或表示時間和日期的字符串處理成 datetime 類型。
friends 使用Python的 typing 系統,需要一個整數列表,就像 id 字段一樣,類整數的對象將會被轉換為整數。
前面實例化的時候,是按預期的參數傳值的,如果id不是int 類型,實例化失敗的時候,看看會發生什么?
如果驗證失敗,pydantic會拋出一個錯誤,列出錯誤的原因:
external_data1 = {
'id': 'aaa',
'birth': '2019-06-01 12:22',
'friends': [1, 2, '3'],
}
user1 = User(
**external_data1
)
user.dict()
校驗失敗,拋出異常ValidationError:id value is not a valid integer
Traceback (most recent call last):
File ".../a.py", line 27, in <module>
**external_data1
File "pydantic\main.py", line 331, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 1 validation error for User
id
value is not a valid integer (type=type_error.integer)
接收異常
from pydantic import ValidationError
external_data1 = {
'id': 'aaa',
'birth': '2019-06-01 12:22',
'friends': [1, 2, '3'],
}
try:
user1 = User(**external_data1)
except ValidationError as e:
print(e.json())
異常內容也可以用json格式展示
[
{
"loc": [
"id"
],
"msg": "value is not a valid integer",
"type": "type_error.integer"
}
]
