当前位置: 首页 > article >正文

[Python] Pydantic从基础到高级用法示例

Pydantic 是一个用于数据验证和设置管理的 Python 库,广泛应用于数据模型的构建、数据解析和验证。以下是 Pydantic 的基础用法到高级用法的代码示例与解析。


1. 基础用法:定义数据模型

Pydantic 的核心功能是通过定义数据模型来验证和解析数据。

示例代码:

from pydantic import BaseModel

# 定义一个数据模型
class User(BaseModel):
    id: int
    name: str
    age: int

# 使用模型验证数据
user_data = {"id": 1, "name": "Alice", "age": 25}
user = User(**user_data)

print(user)
print(user.name)  # 访问字段

解析:

  • BaseModelPydantic 的核心类,用于定义数据模型。
  • 模型中的字段类型(如 int, str)用于数据验证。
  • 通过 User(**user_data) 可以将字典数据解析为模型实例。
  • 模型实例的字段可以直接访问,如 user.name

2. 默认值与可选字段

可以为字段设置默认值,或将其标记为可选字段。

示例代码:

from typing import Optional
from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    age: Optional[int] = None  # 可选字段,默认值为 None
    is_active: bool = True  # 默认值为 True

# 使用模型验证数据
user_data = {"id": 1, "name": "Bob"}
user = User(**user_data)

print(user)

解析:

  • Optional[int] 表示字段是可选的,可以为 None
  • 默认值可以直接在字段定义中设置,如 is_active: bool = True

3. 数据验证

Pydantic 提供了强大的数据验证功能,可以通过字段类型和自定义验证器实现。

示例代码:

from pydantic import BaseModel, ValidationError, validator

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

    # 自定义验证器
    @validator("age")
    def check_age(cls, value):
        if value < 0:
            raise ValueError("Age must be a positive number")
        return value

# 验证数据
try:
    user = User(id=1, name="Alice", age=-10)
except ValidationError as e:
    print(e)

解析:

  • @validator 装饰器用于定义自定义验证器。
  • 验证器会在数据解析时自动调用,如果验证失败会抛出 ValidationError

4. 嵌套模型

Pydantic 支持嵌套模型,可以处理复杂的数据结构。

示例代码:

from pydantic import BaseModel

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

class User(BaseModel):
    id: int
    name: str
    address: Address  # 嵌套模型

# 使用嵌套模型
user_data = {
    "id": 1,
    "name": "Alice",
    "address": {"city": "New York", "country": "USA"},
}
user = User(**user_data)

print(user)
print(user.address.city)  # 访问嵌套字段

解析:

  • 嵌套模型通过将另一个 BaseModel 类作为字段类型实现。
  • 嵌套模型的字段可以通过点号访问,如 user.address.city

5. 动态模型创建

Pydantic 支持动态创建模型,适用于需要根据运行时条件生成模型的场景。

示例代码:

from pydantic import BaseModel, create_model

# 动态创建模型
DynamicUser = create_model(
    "DynamicUser",
    id=(int, ...),  # 必填字段
    name=(str, "Anonymous"),  # 默认值为 "Anonymous"
    age=(int, 18),  # 默认值为 18
)

# 使用动态模型
user = DynamicUser(id=1)
print(user)

解析:

  • create_model 函数用于动态创建模型。
  • 字段类型和默认值可以通过元组指定。

6. JSON 序列化与反序列化

Pydantic 提供了便捷的 JSON 序列化与反序列化功能。

示例代码:

from pydantic import BaseModel

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

# 序列化为 JSON
user = User(id=1, name="Alice")
user_json = user.json()
print(user_json)

# 从 JSON 反序列化
user_data = '{"id": 2, "name": "Bob"}'
user = User.parse_raw(user_data)
print(user)

解析:

  • user.json() 将模型实例序列化为 JSON 字符串。
  • User.parse_raw() 将 JSON 字符串反序列化为模型实例。

7. 高级用法:自定义根类型

Pydantic 支持自定义根类型,适用于处理非标准数据结构。

示例代码:

from typing import List
from pydantic import BaseModel

class UserList(BaseModel):
    __root__: List[str]  # 自定义根类型

# 使用自定义根类型
user_list = UserList(__root__=["Alice", "Bob", "Charlie"])
print(user_list)
print(user_list.__root__)  # 访问根数据

解析:

  • __root__ 字段用于定义自定义根类型。
  • 适用于处理列表、字典等非标准数据结构。

8. 高级用法:配置模型行为

Pydantic 允许通过 Config 类配置模型的行为。

示例代码:

from pydantic import BaseModel

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

    class Config:
        allow_mutation = False  # 禁止修改模型实例
        anystr_lower = True  # 自动将字符串字段转换为小写

# 使用配置
user = User(id=1, name="Alice")
print(user.name)  # 输出: alice

# 尝试修改字段会报错
try:
    user.name = "Bob"
except TypeError as e:
    print(e)

解析:

  • Config 类用于配置模型的行为。
  • 例如,allow_mutation 控制是否允许修改模型实例,anystr_lower 控制是否自动将字符串字段转换为小写。

9. 高级用法:与 FastAPI 集成

PydanticFastAPI 的核心依赖,用于定义请求和响应的数据结构。

示例代码:

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

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

@app.post("/users")
def create_user(user: User):
    return {"message": f"User {user.name} created"}

# 运行 FastAPI 应用
# uvicorn main:app --reload

解析:

  • User 模型用于定义请求体的数据结构。
  • FastAPI 会自动验证请求数据是否符合模型定义。

总结

Pydantic 是一个功能强大的数据验证和解析库,适用于从简单到复杂的数据处理场景。通过掌握其基础用法和高级特性,可以显著提升代码的健壮性和可维护性。


http://www.kler.cn/a/555313.html

相关文章:

  • python中使用数据库sqlite3
  • 计算机网络:应用层 —— 动态主机配置协议 DHCP
  • vue如何将获取到的数据进行分页
  • uniapp中引入Vant Weapp的保姆级教学(包含错误处理)
  • DarkLabel 2.4使用指南:高效标注视频数据目标检测标签
  • Jenkins上无法查看已成功生成的Junit报告
  • 人工智能与自闭症的研究现状及未来趋势
  • Git命令行入门
  • [NKU]C++理论课 cours 3 数据抽象(封装->隐藏实现的手段,隐藏->封装的重要目标)
  • 2025软件测试面试题大全(78题含答案解析)
  • VSCode 中使用 Snippets 设置常用代码块
  • 大厂算法面试常见问题总结:高频考点与备战指南
  • [数据结构] Map的使用与注意事项
  • Python 将PPT幻灯片和形状转换为多种图片格式(JPG, PNG, BMP, SVG, TIFF)
  • 《DeepSeek模型压缩:在高效与性能间寻平衡》
  • LLM(十五)| Kimi k1.5:解锁语言模型强化学习新高度
  • 2月17日c语言框架
  • 最新扣子(Coze)案例教程:全自动DeepSeek 写影评+批量生成 + 发布飞书,提效10 倍!手把手教学,完全免费教程
  • MySQL误删控制文件导致系统无法正常启动
  • 标量化rknn的输入输出向量转换处理