1. 程式人生 > 其它 >pydantic學習與使用-1.pydantic簡介與基礎入門

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"
  }
]