最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)

 更新時間:2025年04月09日 09:54:18   作者:山河不見老  
本文主要介紹了Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)

1. 什么是 Pydantic?

Pydantic 是一個功能強(qiáng)大的 Python 數(shù)據(jù)驗(yàn)證庫,它通過 Python 類型注解實(shí)現(xiàn)快速的數(shù)據(jù)驗(yàn)證和轉(zhuǎn)換。它不僅提供了全面的類型驗(yàn)證、自動數(shù)據(jù)轉(zhuǎn)換和詳細(xì)的錯誤處理機(jī)制,還具有基于 Rust 實(shí)現(xiàn)的高性能核心驗(yàn)證器。憑借其優(yōu)秀的 IDE 支持和可擴(kuò)展性,Pydantic 在 FastAPI 等 Web 框架、配置管理、數(shù)據(jù)序列化以及 API 接口模型定義等多個場景中得到廣泛應(yīng)用。

2. 安裝

pip install pydantic
pip install pydantic-settings

3. 基礎(chǔ)使用

在開始使用 Pydantic 之前,我們需要了解它的核心概念和基本用法。Pydantic 的核心是通過定義模型類來實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證,這些模型類繼承自 BaseModel。

3.1 創(chuàng)建基礎(chǔ)模型

基礎(chǔ)模型是 Pydantic 中最常用的功能。通過繼承 BaseModel 類,我們可以定義數(shù)據(jù)結(jié)構(gòu)和類型約束。每個字段都可以使用 Python 的類型注解來指定其類型,這些類型會在數(shù)據(jù)驗(yàn)證時被強(qiáng)制執(zhí)行。

from pydantic import BaseModel
from typing import Optional
from datetime import datetime

class User(BaseModel):
    id: int
    username: str
    email: str
    full_name: Optional[str] = None  # 可選字段
    created_at: datetime = datetime.now()  # 默認(rèn)值

# 創(chuàng)建實(shí)例
user = User(
    id=1,
    username="john_doe",
    email="john@example.com"
)

# 訪問數(shù)據(jù)
print(user.username)  # 輸出: john_doe

# 轉(zhuǎn)換為字典
user_dict = user.model_dump()

字段定義說明:

  • id: int - 必填的整數(shù)字段
  • username: str - 必填的字符串字段
  • email: str - 必填的郵箱字段
  • full_name: Optional[str] - 可選的字符串字段,可以為 None
  • created_at: datetime - 帶默認(rèn)值的日期時間字段

3.2 數(shù)據(jù)驗(yàn)證

Pydantic 的數(shù)據(jù)驗(yàn)證是自動進(jìn)行的,當(dāng)創(chuàng)建模型實(shí)例時,輸入數(shù)據(jù)會自動根據(jù)定義的類型進(jìn)行驗(yàn)證和轉(zhuǎn)換。如果驗(yàn)證失敗,Pydantic 會拋出詳細(xì)的 ValidationError 異常。

from pydantic import BaseModel, EmailStr, ValidationError

class UserRegistration(BaseModel):
    username: str
    email: EmailStr
    age: int

try:
    # 嘗試創(chuàng)建無效數(shù)據(jù)
    user = UserRegistration(
        username="john",
        email="invalid-email",  # 無效郵箱
        age="not_a_number"  # 無效年齡
    )
except ValidationError as e:
    print("驗(yàn)證錯誤:")
    for error in e.errors():
        print(f"- {error['loc'][0]}: {error['msg']}")

當(dāng)驗(yàn)證失敗時,錯誤信息會包含:

  • 具體是哪個字段驗(yàn)證失敗
  • 失敗的原因
  • 期望的數(shù)據(jù)類型
  • 實(shí)際接收到的數(shù)據(jù)類型

3.3 嵌套模型

在實(shí)際應(yīng)用中,數(shù)據(jù)結(jié)構(gòu)往往是嵌套的。Pydantic 完全支持模型嵌套,這使得我們可以構(gòu)建復(fù)雜的數(shù)據(jù)結(jié)構(gòu),同時保持?jǐn)?shù)據(jù)驗(yàn)證的嚴(yán)謹(jǐn)性。

from typing import List

class Address(BaseModel):
    street: str
    city: str
    country: str

class User(BaseModel):
    name: str
    addresses: List[Address]

# 使用嵌套模型
user = User(
    name="John Doe",
    addresses=[
        {"street": "123 Main St", "city": "Boston", "country": "USA"},
        {"street": "456 Park Ave", "city": "New York", "country": "USA"}
    ]
)

嵌套模型的優(yōu)勢:

  • 保持?jǐn)?shù)據(jù)結(jié)構(gòu)的層次清晰
  • 支持復(fù)雜的數(shù)據(jù)驗(yàn)證邏輯
  • 方便數(shù)據(jù)的序列化和反序列化

4. 常用驗(yàn)證規(guī)則

Pydantic 提供了豐富的驗(yàn)證規(guī)則,可以滿足各種復(fù)雜的數(shù)據(jù)驗(yàn)證需求。這些規(guī)則可以組合使用,構(gòu)建出強(qiáng)大的驗(yàn)證邏輯。

4.1 基礎(chǔ)驗(yàn)證規(guī)則

Field 類是 Pydantic 提供的字段定義工具,它允許我們?yōu)樽侄翁砑痈鞣N驗(yàn)證規(guī)則和元數(shù)據(jù)。通過 Field,我們可以定義字段的約束條件、默認(rèn)值和描述信息。

from pydantic import BaseModel, Field, EmailStr, HttpUrl, constr

class User(BaseModel):
    # 字符串驗(yàn)證
    name: str = Field(..., min_length=2, max_length=50)  # 必填,長度2-50
    username: str = Field(..., pattern="^[a-zA-Z0-9_-]+$")  # 只允許字母、數(shù)字、下劃線和橫杠

    # 數(shù)值驗(yàn)證
    age: int = Field(..., ge=0, le=120)  # 大于等于0,小于等于120
    score: float = Field(..., gt=0, lt=100)  # 大于0,小于100

    # 特殊類型驗(yàn)證
    email: EmailStr  # 郵箱驗(yàn)證
    website: HttpUrl  # URL驗(yàn)證

    # 可選字段
    description: str | None = Field(None, max_length=1000)  # 可選,最大長度1000

驗(yàn)證規(guī)則說明:

  • min_length/max_length: 控制字符串長度
  • pattern: 使用正則表達(dá)式驗(yàn)證字符串格式
  • ge/le: 大于等于/小于等于
  • gt/lt: 大于/小于

4.2 列表驗(yàn)證

from typing import List

class Order(BaseModel):
    # 列表長度驗(yàn)證
    items: List[str] = Field(..., min_items=1, max_items=10)

    # 列表元素唯一性驗(yàn)證
    tags: List[str] = Field(..., unique_items=True)

    # 價格必須為正數(shù)的列表
    prices: List[float] = Field(..., gt=0)

4.3 自定義驗(yàn)證器

from pydantic import BaseModel, model_validator, field_validator
from datetime import datetime

class Order(BaseModel):
    order_id: str
    created_at: datetime
    total_amount: float
    items_count: int

    # 字段級驗(yàn)證器
    @field_validator('order_id')
    def validate_order_id(cls, v):
        if not v.startswith('ORD-'):
            return f'ORD-{v}'
        return v

    # 模型級驗(yàn)證器
    @model_validator(mode='after')
    def validate_total(self):
        if self.total_amount <= 0 and self.items_count > 0:
            raise ValueError('Total amount must be positive when items exist')
        return self

4.4 條件驗(yàn)證

from typing import Optional
from pydantic import BaseModel, Field, model_validator

class Product(BaseModel):
    name: str
    price: float
    discount: Optional[float] = None
    final_price: Optional[float] = None

    @model_validator(mode='after')
    def calculate_final_price(self):
        if self.discount is not None:
            if not 0 <= self.discount <= 1:
                raise ValueError('Discount must be between 0 and 1')
            self.final_price = self.price * (1 - self.discount)
        else:
            self.final_price = self.price
        return self

4.5 常用驗(yàn)證類型

from pydantic import BaseModel, Field, EmailStr, HttpUrl, conint, confloat, constr

class UserProfile(BaseModel):
    # 受約束的字符串
    username: constr(min_length=3, max_length=20, pattern="^[a-zA-Z0-9_]+$")

    # 受約束的整數(shù)
    age: conint(ge=0, le=120)

    # 受約束的浮點(diǎn)數(shù)
    height: confloat(ge=0, le=300)

    # 枚舉選擇
    status: str = Field(..., pattern="^(active|inactive|pending)$")

    # 布爾值
    is_active: bool = True

這些驗(yàn)證規(guī)則涵蓋了日常開發(fā)中最常見的數(shù)據(jù)驗(yàn)證場景。通過組合使用這些規(guī)則,可以構(gòu)建出復(fù)雜的數(shù)據(jù)驗(yàn)證邏輯。記住幾個要點(diǎn):

  • Field(…) 中的 … 表示該字段必填
  • 使用 Optional 或 | None 表示可選字段
  • 驗(yàn)證器分為字段級 (field_validator) 和模型級 (model_validator)
  • 可以組合多個驗(yàn)證規(guī)則
  • 驗(yàn)證規(guī)則的順序: 先定義字段,再添加驗(yàn)證規(guī)則
  • 驗(yàn)證規(guī)則的執(zhí)行順序: 先定義的規(guī)則先執(zhí)行

5. 實(shí)際應(yīng)用示例

5.1 API 請求驗(yàn)證

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = False

@app.post("/items/")
async def create_item(item: Item):
    return item

5.2 配置管理

from pydantic_settings import BaseSettings, SettingsConfigDict

class Settings(BaseSettings):
    database_url: str
    api_key: str
    debug: bool = False

    model_config = SettingsConfigDict(env_file='.env')

# 從環(huán)境變量加載配置
settings = Settings()

6. 小技巧

6.1. 數(shù)據(jù)轉(zhuǎn)換:

# 字典轉(zhuǎn)模型
data = {"name": "John", "age": "25"}  # 注意 age 是字符串
user = User.model_validate(data)  # 推薦使用 model_validate 而不是 parse_obj

# 模型轉(zhuǎn) JSON
json_str = user.model_dump_json()  # 推薦使用 model_dump_json 而不是 json()

# 模型轉(zhuǎn)字典
user_dict = user.model_dump()  # 推薦使用 model_dump 而不是 dict()

# 模型轉(zhuǎn) JSON 字符串(帶縮進(jìn))
json_str = user.model_dump_json(indent=4)

# JSON 字符串轉(zhuǎn)模型
user = User.model_validate_json(json_str)

6.2 錯誤處理:

try:
    user = User(name="John", age="invalid")
except ValidationError as e:
    print("數(shù)據(jù)無效:", e)

到此這篇關(guān)于Python Pydantic數(shù)據(jù)驗(yàn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python Pydantic數(shù)據(jù)驗(yàn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • python使用 __init__初始化操作簡單示例

    python使用 __init__初始化操作簡單示例

    這篇文章主要介紹了python使用 __init__初始化操作,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中使用__init__進(jìn)行初始化操作相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • python實(shí)現(xiàn)批量打開windows cmd過程

    python實(shí)現(xiàn)批量打開windows cmd過程

    作者分享了使用Python批量打開cmd窗口并使用subprocess模塊實(shí)現(xiàn)tcping測試的方法,為了解決手動關(guān)閉窗口耗時的問題,作者推薦使用kill進(jìn)程名稱的方式結(jié)束運(yùn)行,提高測試效率
    2026-05-05
  • 在Python中使用第三方模塊的教程

    在Python中使用第三方模塊的教程

    這篇文章主要介紹了在Python中使用第三方模塊的教程,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-04-04
  • python使用psutil模塊獲取系統(tǒng)狀態(tài)

    python使用psutil模塊獲取系統(tǒng)狀態(tài)

    作為程序猿,大家可能都熟悉linux系統(tǒng)的基礎(chǔ)信息獲取方法都是通過shell來獲取,但是在python中,我們還可以使用psutil模塊來獲取系統(tǒng)信息。psutil模塊把shell查看系統(tǒng)基礎(chǔ)信息的功能都包裝了下,使用更加簡單,功能豐富。
    2016-08-08
  • Python如何實(shí)現(xiàn)動態(tài)數(shù)組

    Python如何實(shí)現(xiàn)動態(tài)數(shù)組

    這篇文章主要介紹了Python如何實(shí)現(xiàn)動態(tài)數(shù)組,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • python 解壓pkl文件的方法

    python 解壓pkl文件的方法

    今天小編就為大家分享一篇python 解壓pkl文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Django框架使用mysql視圖操作示例

    Django框架使用mysql視圖操作示例

    這篇文章主要介紹了Django框架使用mysql視圖操作,結(jié)合實(shí)例形式分析了mysql視圖的創(chuàng)建、查看以及Django框架使用mysql視圖相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • python實(shí)現(xiàn)sm2和sm4國密(國家商用密碼)算法的示例

    python實(shí)現(xiàn)sm2和sm4國密(國家商用密碼)算法的示例

    這篇文章主要介紹了python實(shí)現(xiàn)sm2和sm4國密(國家商用密碼)算法的示例,幫助大家使用python加密文件,感興趣的朋友可以了解下
    2020-09-09
  • 最新評論

    崇左市| 林州市| 通榆县| 淳安县| 贡嘎县| 永丰县| 鹤山市| 旺苍县| 安图县| 康平县| 肃南| 屏边| 江西省| 安平县| 定西市| 彭山县| 德清县| 沁源县| 绥宁县| 白银市| 昌平区| 建阳市| 襄城县| 岢岚县| 建湖县| 新化县| 揭东县| 嘉定区| 永嘉县| 洪洞县| 邢台市| 抚顺市| 绥江县| 手机| 北碚区| 奉化市| 邛崃市| 大足县| 五常市| 榆社县| 鄂温|