pydantic學習與使用-1.pydantic簡介與基礎入門


前言

版本文檔: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"
  }
]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM