Python的Pydantic概念及基本用法
Pydantic是Python生態(tài)中最流行的數(shù)據(jù)驗證和解析庫。絕大多數(shù)的Web框架(如FastAPI)和大模型框架LangChain都是基于它構(gòu)建。簡單說他是一個基于Type Hints的庫。其核心功能有兩個,分別是:
- 數(shù)據(jù)驗證(Validation):確保你拿到的數(shù)據(jù),符合你定義的格式
- 數(shù)據(jù)解析(parsing):把凌亂的輸入,自動轉(zhuǎn)換成正確的類型
只要模型實例化成功,你就可以百分之百信任這個對象里的數(shù)據(jù)類型是完全正確的。
一、基本用法
pip install pydantic
1、定義模型
使用 BaseModel 類來創(chuàng)建數(shù)據(jù)模型:
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int # 如果不匹配,Pydantic 會嘗試強制轉(zhuǎn)換
is_active: bool = True # 可以有默認值2、實例化與驗證
# 從字典創(chuàng)建實例
user = User(name="Alice", age="25") # 注意:age 是字符串,但會被轉(zhuǎn)為 int
print(user.name) # Alice
print(user.age) # 25 (int)
print(user.is_active) # True
# 訪問原始數(shù)據(jù)
print(user.model_dump()) # {'name': 'Alice', 'age': 25, 'is_active': True}如果數(shù)據(jù)不合規(guī),Pydantic 會拋出清晰的錯誤提示,而不是讓程序在后續(xù)運行中崩潰。
from pydantic import ValidationError
try:
User(name="Bob", age="not_a_number")
except ValidationError as e:
print(e.json()) # 會詳細列出格式錯誤3、字段約束
字段約束不僅能檢查“類型”對不對,還能檢查“內(nèi)容”是否符合業(yè)務(wù)規(guī)則(比如:年齡不能是負數(shù)、密碼不能太短)。使用 Field 來添加額外的驗證規(guī)則:
from pydantic import BaseModel, Field
class Product(BaseModel):
name: str = Field(min_length=2, max_length=50)
price: float = Field(gt=0) # 必須大于 0
tags: list[str] = Field(default=[], min_items=1)
# 示例
Product(name="Laptop", price=999.99, tags=["electronics"])| 約束縮寫 | 全稱 | 適用類型 | 說明 |
gt | greater than | int, float | 大于 |
ge | greater than or equal | int, float | 大于等于 |
lt | less than | int, float | 小于 |
le | less than or equal | int, float | 小于等于 |
min_length | - | str, list, dict | 最小長度 |
max_length | - | str, list, dict | 最大長度 |
pattern | - | str | 正則表達式匹配 |
allow_inf_nan | - | float | 是否允許無窮大或 NaN |
4、嵌套使用
可以將不同的數(shù)據(jù)模型嵌套起來使用。
from typing import List, Optional
from pydantic import BaseModel, Field
# 1. 定義底層模型:商品
class Item(BaseModel):
name: str
price: float
quantity: int = Field(gt=0, description="數(shù)量必須大于0")
# 2. 定義底層模型:收貨地址
class Address(BaseModel):
city: str
street: str
zip_code: Optional[str] = None
# 3. 定義頂層模型:訂單(嵌套了 Item 和 Address)
class Order(BaseModel):
order_id: int
items: List[Item] # 嵌套商品列表
address: Address # 嵌套地址對象
remark: str = "無"
# --- 模擬原始數(shù)據(jù)(例如來自前端請求或數(shù)據(jù)庫) ---
raw_data = {
"order_id": 1001,
"items": [
{"name": "鍵盤", "price": 299.0, "quantity": 1},
{"name": "鼠標", "price": 99.5, "quantity": 2}
],
"address": {
"city": "上海",
"street": "南京東路 123 號"
}
}
# 解析數(shù)據(jù)
order = Order(**raw_data)
# 訪問嵌套數(shù)據(jù)
print(f"訂單 ID: {order.order_id}")
print(f"第一件商品名稱: {order.items[0].name}") # 自動補全非常爽
print(f"收貨城市: {order.address.city}")- 多級校驗:當你實例化
Order時,Pydantic 會遞歸校驗。如果items列表里第二個商品的price格式不對,它會準確告訴你報錯位置。 - IDE 自動補全:在編寫代碼時,輸入
order.address.后,IDE 會自動提示city和street。這避免了手動處理字典時經(jīng)常出現(xiàn)的拼寫錯誤。 - 自動轉(zhuǎn)換:如果
items里的price傳的是字符串"99.5",Pydantic 會自動幫你轉(zhuǎn)成float。
二、常見應(yīng)用場景
最常見的場景當然是web API??梢杂盟鼇矶x API 的請求體和響應(yīng)體。FastAPI 會自動根據(jù)你的 Pydantic 模型生成文檔,并自動校驗前端傳來的 JSON 數(shù)據(jù)。其次是進行配置管理,從環(huán)境變量或配置文件加載并驗證配置。通過 pydantic-settings 擴展,可以輕松讀取環(huán)境變量(.env 文件)。
pip install pydantic-settings
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
db_url: str
api_key: str
class Config:
env_file = ".env"
settings = Settings() # 自動從環(huán)境變量加載并校驗到此這篇關(guān)于Python的Pydantic概念及基本用法的文章就介紹到這了,更多相關(guān)Python Pydantic內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python requests發(fā)送post請求的一些疑點
在Python爬蟲中,使用requests發(fā)送請求,訪問指定網(wǎng)站,是常見的做法,這篇文章主要介紹了Python requests發(fā)送post請求的一些疑點,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-05-05
python basemap 畫出經(jīng)緯度并標定的實例
今天小編就為大家分享一篇python basemap 畫出經(jīng)緯度并標定的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python Django使用forms來實現(xiàn)評論功能
這篇文章主要為大家詳細介紹了Python Django使用forms來實現(xiàn)評論功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08
基于進程內(nèi)通訊的python聊天室實現(xiàn)方法
這篇文章主要介紹了基于進程內(nèi)通訊的python聊天室實現(xiàn)方法,實例分析了Python聊天室的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2015-06-06

