pydantic學習與使用-1.pydantic簡介與基礎入門
前言
版本文件:v1.9.0
使用 python 型別註釋的資料驗證和設定管理。
pydantic在執行時強制執行型別提示,並在資料無效時提供使用者友好的錯誤。
定義資料應該如何在純粹的、規範的 python 中;並使用 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"
}
]