首頁 >後端開發 >Python教學 >Pydantic:手動驗證的終點! ✨

Pydantic:手動驗證的終點! ✨

Patricia Arquette
Patricia Arquette原創
2024-11-26 00:07:11935瀏覽

Pydantic 是一個 Python 資料驗證和設定管理庫。它使用 Python 類型提示來驗證和解析數據,確保您的程式碼能夠處理正確結構化和類型化的數據。透過利用 Python 的類似資料類別的模型結構,Pydantic 可以輕鬆定義複雜資料的模式,並以乾淨的 Python 方式自動驗證和序列化/反序列化資料。讓我們來探討一下主要功能:

數據驗證

使用 Python 的類型提示會根據模式自動驗證輸入資料。

from pydantic import BaseModel, ValidationError

class User(BaseModel):
    id: int
    name: str
    email: str

# Valid input
user = User(id=1, name="John Doe", email="john@example.com")
print(user)

# Invalid input
try:
    user = User(id="not-an-integer", name="Jane", email="jane@example.com")
except ValidationError as err:
    print(err)

每當你想定義資料模型時,請使用 pydantic.BaseModel!

功能驗證

Pydantic 提供了強大的工具,不僅可以驗證資料模型,還可以驗證函數的輸入和輸出。這是使用 @validate_call 裝飾器實現的,可讓您對函數參數和傳回值強制執行嚴格的資料驗證。如果提供的參數或傳回類型與預期類型不匹配,則會引發 ValidationError。

from pydantic import validate_call

@validate_call
def greet(name: str, age: int) -> str:
    return f"Hello {name}, you are {age} years old."

# Valid input
print(greet("Alice", 30))  # Output: Hello Alice, you are 30 years old.

# Invalid input
try:
    greet("Bob", "not-a-number")
except Exception as e:
    print(e)

透過在 @validate_call 中啟用 validate_return 標誌,Pydantic 也會根據其註解的回傳類型驗證函數的傳回值。這可確保函數遵循預期的輸出模式。

from pydantic import validate_call

@validate_call(validate_return=True)
def calculate_square(number: int) -> int:
    return number ** 2  # Correct return type

# Valid input and return
print(calculate_square(4))  # Output: 16

# Invalid return value
@validate_call(validate_return=True)
def broken_square(number: int) -> int:
    return str(number ** 2)  # Incorrect return type

try:
    broken_square(4)
except Exception as e:
    print(e)

解析

Pydantic 可以將複雜的巢狀結構(包括 JSON 資料)解析為模型物件。

from pydantic import BaseModel
from typing import List

class Item(BaseModel):
    name: str
    price: float

class Order(BaseModel):
    items: List[Item]
    total: float

# JSON-like data
data = {
    "items": [
        {"name": "Apple", "price": 1.2},
        {"name": "Banana", "price": 0.8}
    ],
    "total": 2.0
}

order = Order(**data) 
print(order) # items=[Item(name='Apple', price=1.2), Item(name='Banana', price=0.8)] total=2.0

序列化和反序列化

Pydantic 模型可以序列化為 JSON 或字典並重構回來。

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str

# Create a model instance
user = User(id=1, name="Alice", email="alice@example.com")

# Serialize to dictionary and JSON
user_dict = user.model_dump()
user_json = user.model_dump(mode='json')

print("Dictionary:", user_dict)
print("JSON:", user_json)

# Deserialize back to the model
new_user = User.model_validate(user_json)
print("Parsed User:", new_user)

靈活的驗證

資料驗證不是強制型別驗證。例如,如果您定義一個模型,其中 id、due_date 和優先權欄位分別為 int、bool 和 datetime 類型,則可以傳遞:

  • 數字字串作為id
  • ISO-8601UTC 或其他日期格式的字串作為 due_date
  • 'yes'/'no'、'on'/'off'、'true'/'false'、1/0 等為優先級
from sensei import APIModel
from datetime import datetime


class Task(APIModel):
    id: int
    due_date: datetime
    priority: bool


task = Task(due_date='2024-10-15T15:30:00',>



<p>The result will be<br>
</p>

<pre class="brush:php;toolbar:false">Task(id=1, due_date=datetime.datetime(2024, 10, 15, 15, 30), priority=True)

自訂驗證

您也可以使用驗證器在模型中定義自訂驗證邏輯。它們允許您套用更複雜的驗證規則,這些規則無法使用內建類型或欄位約束輕鬆表達。驗證器是透過 field_validator 裝飾器或 Field 物件定義的。您可以將一個或多個欄位名稱傳遞給 field_validator,以確定哪些欄位將使用此驗證器,或透過「*」為每個欄位套用驗證器。

輸入 import Any
從 pydantic 匯入 Field、field_validator、EmailStr、BaseModel

使用者類別(基礎模型):
    id:整數
    使用者名稱:str = Field(pattern=r'^w $')
    電子郵件:EmailStr
    年齡:int = Field(18,ge=14)
    is_active: 布爾 = True
    角色:列表[str]

    # 定義驗證器在內部解析「之前」執行
    @field_validator('角色', mode='之前')
    def _validate_roles(cls,值:任意):
        返回 value.split(',') if isinstance(value, str) else value

user = User(id=1, 使用者名稱='john', email='john@example.com', 角色='學生,歌手')
列印(使用者)#>



<h2>
  
  
  開源專案
</h2>

<p>有許多由 Pydantic 支援的開源專案。讓我們來探索其中最好的:</p>

<h3>
  
  
  快速API
</h3>

<p>Pydantic 最突出的用例之一是 FastAPI,這是一個使用 Python 建立 API 的現代 Web 框架。 FastAPI 廣泛使用 Pydantic 模型進行請求正文驗證、查詢參數和回應模式。 </p>

  • 資料來源:https://github.com/fastapi/fastapi
  • 文件:https://fastapi.tiangolo.com

Pydantic: The end of manual validations! ✨

老師

FastAPI 是為建立 API 而設計的,而 Sensei 則是為快速、輕鬆地包裝這些 API 而設計的。由 Sensei 提供支援的 API 用戶端可確保使用者獲得相關的資料模型,並且不會出現令人困惑的錯誤。

  • 資料來源:https://github.com/CrocoFactory/sensei
  • 文件:https://sensei.crocofactory.dev

Pydantic: The end of manual validations! ✨

SQLModel 和 Typer

SQLModelTyper 是 FastAPI 的創建者 Sebastián Ramírez 開發的兩個出色的專案。

SQLModel 是一個旨在簡化 Python 應用程式中的資料庫互動的函式庫。 SQLModel 建構於 SQLAlchemyPydantic 之上,將 ORM 的強大功能與資料驗證和序列化的便利性結合在一起。

  • 來源:https://github.com/fastapi/sqlmodel
  • 文件:https://sqlmodel.tiangolo.com

Typer 是一個使用 Python 建立命令列介面 (CLI) 應用程式的框架。它透過使用 Python 的類型提示自動產生使用者友好的 CLI 命令和幫助文字來簡化流程。

  • 來源:https://github.com/fastapi/typer
  • 文件:https://typer.tiangolo.com

以上是Pydantic:手動驗證的終點! ✨的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn