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 類型,則可以傳遞:
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>
FastAPI 是為建立 API 而設計的,而 Sensei 則是為快速、輕鬆地包裝這些 API 而設計的。由 Sensei 提供支援的 API 用戶端可確保使用者獲得相關的資料模型,並且不會出現令人困惑的錯誤。
SQLModel 和 Typer 是 FastAPI 的創建者 Sebastián Ramírez 開發的兩個出色的專案。
SQLModel 是一個旨在簡化 Python 應用程式中的資料庫互動的函式庫。 SQLModel 建構於 SQLAlchemy 和 Pydantic 之上,將 ORM 的強大功能與資料驗證和序列化的便利性結合在一起。
Typer 是一個使用 Python 建立命令列介面 (CLI) 應用程式的框架。它透過使用 Python 的類型提示自動產生使用者友好的 CLI 命令和幫助文字來簡化流程。
以上是Pydantic:手動驗證的終點! ✨的詳細內容。更多資訊請關注PHP中文網其他相關文章!