Pydantic
Pydantic 是一個在 Python 中用於資料驗證和解析的第三方庫。它提供了一種簡單且直觀的方式來定義資料模型,並使用這些模型對資料進行驗證和轉換。
Pydantic 的一些主要特性:
- 型別註解:Pydantic 使用型別註解來定義模型的欄位型別。你可以使用 Python 內建的型別、自定義型別或者其他 Pydantic 提供的驗證型別。
- 資料驗證:Pydantic 自動根據模型定義進行資料驗證。它會檢查欄位的型別、長度、範圍等,並自動報告驗證錯誤。你可以使用
ValidationError
異常來捕獲驗證錯誤。 - 模型轉換: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_length
和max_length
:針對字串型別的欄位定義最小和最大長度限制。gt
、ge
、lt
和le
:針對數值型別的欄位定義大於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))