Pydantic:強大的Python 資料驗證庫

發表於2024-02-29

在這裡插入圖片描述

Pydantic

Pydantic 是一個在 Python 中用於資料驗證和解析的第三方庫。它提供了一種簡單且直觀的方式來定義資料模型,並使用這些模型對資料進行驗證和轉換。

Pydantic 的一些主要特性:

  1. 型別註解:Pydantic 使用型別註解來定義模型的欄位型別。你可以使用 Python 內建的型別、自定義型別或者其他 Pydantic 提供的驗證型別。
  2. 資料驗證:Pydantic 自動根據模型定義進行資料驗證。它會檢查欄位的型別、長度、範圍等,並自動報告驗證錯誤。你可以使用 ValidationError 異常來捕獲驗證錯誤。
  3. 模型轉換:Pydantic 提供了從各種資料格式(例如 JSON、字典)到模型例項的轉換功能。它可以自動將輸入資料解析成模型例項,並保留型別安全性和驗證規則。

Pydantic 使用前需要先進行安裝。

pip install pydantic

Pydantic 基本操作

使用 Pydantic,可以定義一個模型類,該類需要繼承 pydantic 中的 BaseModel 類,模型類描述了資料的結構和型別,並指定驗證規則。

然後,可以使用這個模型類來驗證輸入的資料是否符合預期,並以型別安全的方式訪問和運算元據。

from pydantic import BaseModel, ValidationError
class User(BaseModel):    
    name: str    
    age: int    
    email: str
try:    
    user = User(name="Alice", age="30", email="alice@example.com") 
except ValidationError as e:    
    print(e.json())

如果建立例項的資料不符合型別註解的要求,則會報 ValidationError 錯誤。

Pydantic 高階操作

Pydantic 還可以結合 typing 模組,進行預設值,可選欄位屬性等驗證的高階操作。甚至還可以透過 EmailStr 類來直接驗證郵件正確性,但該類依賴一個第三方模組,在使用前需要使用 pip install email-validator 進行安裝後才可以使用。

from typing import Optional
from pydantic import BaseModel, EmailStr
class User(BaseModel):    
    name: str    
    age: int    
    email: EmailStr    
    phone: Optional[str] = None

user = User(name="Alice", age=30, email="alice@example.com")  # 有效
user = User(name="Alice", age=30, email="invalid_email")  # 錯誤:無效的電子郵件

Field 物件

Field函式提供了許多引數來定製欄位的行為。以下是一些常用的引數:

  • ...:表示該欄位是必填項。
  • default:定義欄位的預設值。如果未提供該值,則預設為None,不能與 ... 同時使用。
  • min_lengthmax_length:針對字串型別的欄位定義最小和最大長度限制。
  • gtgeltle:針對數值型別的欄位定義大於 gt、大於等於 ge、小於 lt 和小於等於 le 的限制。
from pydantic import BaseModel, EmailStr, ValidationError, Field
class User(BaseModel):    
    name: str = Field(..., min_length=1, max_length=10)    
    age: int = Field(..., ge=0, le=200)    
    email: EmailStr    
    phone: str = Field(default="13800138000", min_length=11, max_length=11)
user = None
try:    
    user = User(name="Tom", age=22, email="alice@example.com")
except ValidationError as e:    
    a = eval(e.json())    
    print(a[0]["msg"])
finally:    
    print(user)

資料轉換

透過定義模型類,可以將透過網路傳輸或資料庫查詢的資料轉換成模型類物件在程式中使用。

反之,也可以將處理過後的模型類物件轉換成對應的字典或 JSON 資料進行儲存或傳輸。

模型類轉換為字典

使用 模型類.model_dump() 方法可以將一個模型類例項物件轉換為字典型別資料。

from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):    
    name: str = Field(..., min_length=1, max_length=10)    
    age: int = Field(..., ge=0, le=200)    
    email: EmailStr    
    phone: str = Field(default="13800138000", min_length=11, max_length=11)
user = User(name="Tom", age=22, email="alice@example.com")
data = User.model_dump(user)
print(data)
print(type(data))

模型類轉換為JSON

使用 模型類.model_dump_json() 方法可以將一個模型類例項物件轉換為 JSON 字串。

from pydantic import BaseModel, EmailStr, Field
class User(BaseModel):    
    name: str = Field(..., min_length=1, max_length=10)    
    age: int = Field(..., ge=0, le=200)    
    email: EmailStr    
    phone: str = Field(default="13800138000", min_length=11, max_length=11)
user = User(name="Tom", age=22, email="alice@example.com")
data = User.model_dump_json(user)
print(data)
print(type(data))

獲取更多軟體測試技術資料/面試題解析,請點選!

image.png

相關文章