Pydantic 包
942 字
5 分钟
Pydantic 包
Pydantic 是一个基于 Python 类型提示(Type Hints)的数据验证和解析库。它的核心思想是:通过定义数据模型,自动对输入数据进行类型检查和转换,确保你拿到的数据是干净、合规的。
以下是 Pydantic 的常用功能及举例说明:
🎯 核心功能
1. 数据模型定义与自动验证
通过继承 BaseModel 类来定义数据结构。Pydantic 会在创建模型实例时自动进行数据验证和类型转换。
from pydantic import BaseModel, EmailStr, ValidationError
class User(BaseModel): id: int name: str email: EmailStr is_active: bool = True # 带默认值的可选字段
# 自动类型转换:age 传入字符串 "25",会被自动转换为整数 25user = User(id=1, name="Alice", email="alice@example.com", is_active=False)print(user)# 输出: id=1 name='Alice' email='alice@example.com' is_active=False
# 数据验证失败:会抛出清晰的 ValidationError 异常try: invalid_user = User(id="not_an_int", name="Bob", email="bob")except ValidationError as e: print(e)2. 字段约束
使用 Field 函数可以为字段添加更丰富的约束,如数值范围、字符串长度、正则表达式等。
Field 详细使用教程:[[pydantic 之 Field 使用教程]]
from pydantic import BaseModel, Field, EmailStr
class Product(BaseModel): # 字符串长度约束 name: str = Field(..., min_length=2, max_length=50, description="产品名称") # 数值范围约束 price: float = Field(..., gt=0, le=10000, description="价格必须大于0") # 邮箱格式验证 contact_email: EmailStr # 正则表达式约束 code: str = Field(..., pattern=r"^P\d{3}$") # 如 P001, P123
product = Product( name="Laptop", price=999.99, contact_email="test@example.com", code="P001")3. 数据序列化
模型实例可以轻松地转换为字典或 JSON 字符串,方便数据传输。
# 假设已有上面定义的 Product 模型实例product_dict = product.model_dump() # 转为字典print(product_dict)
product_json = product.model_dump_json(indent=2) # 转为格式化的 JSON 字符串print(product_json)4. 嵌套模型
可以将一个 Pydantic 模型作为另一个模型的字段,轻松处理复杂的嵌套数据结构。
from typing import List
class Address(BaseModel): city: str street: str
class Order(BaseModel): order_id: int items: List[Product] # 嵌套 Product 模型列表 address: Address # 嵌套 Address 模型
# 可以直接使用字典数据进行实例化order_data = { "order_id": 1001, "items": [{"name": "Mouse", "price": 50.0, "contact_email": "a@b.com", "code": "P002"}], "address": {"city": "Shanghai", "street": "Nanjing Road"}}order = Order(**order_data)print(order.address.city) # 输出: Shanghai🛠️ 高级用法
1. 自定义验证器
当内置的约束无法满足需求时,可以使用 @field_validator 装饰器编写自定义的验证逻辑。
from pydantic import field_validator
class UserWithValidator(BaseModel): username: str age: int
@field_validator('username') @classmethod def username_no_space(cls, v): if ' ' in v: raise ValueError('用户名不能包含空格') return v
@field_validator('age') @classmethod def age_must_be_positive(cls, v): if v <= 0: raise ValueError('年龄必须为正数') return v2. 高级序列化控制
model_dump() 方法提供了强大的参数来控制序列化行为,这在 API 开发中非常有用。
exclude_unset=True: 只输出用户显式赋值过的字段。这在处理 PATCH 请求(部分更新)时至关重要,可以避免将未提供的字段覆盖为默认值。exclude_none=True: 过滤掉值为None的字段,使输出更简洁。by_alias=True: 使用字段定义的别名进行输出。
class UserPatch(BaseModel): name: str | None = None email: str | None = None
# 用户只想更新 emailpatch_data = UserPatch(email="new@example.com")
# 默认输出包含所有字段print(patch_data.model_dump())# {'name': None, 'email': 'new@example.com'}
# 使用 exclude_unset,只输出显式更新的字段print(patch_data.model_dump(exclude_unset=True))# {'email': 'new@example.com'}3. 模型配置
通过 model_config 可以全局配置模型的行为,例如允许从 ORM 对象属性直接创建模型、设置字段别名生成规则等。
class UserWithConfig(BaseModel): id: int name: str password: str
model_config = { "from_attributes": True, # 允许 model_validate 从任意对象属性创建实例 "populate_by_name": True, # 允许通过字段名和别名进行赋值 }
# 假设有一个 ORM 对象class ORMUser: def __init__(self, id, name, password): self.id = id self.name = name self.password = password
orm_user = ORMUser(1, "Charlie", "secret")# 可以直接从 ORM 对象创建 Pydantic 模型pydantic_user = UserWithConfig.model_validate(orm_user)支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
Pydantic 包
https://kianzhao.site/posts/python-pydantic/ 相关文章 智能推荐
1
pydantic 之 Field 使用教程
分类 `Field` 是 Pydantic 提供的一个函数/标记,用于在模型属性(字段)上指定更丰富的元信息和校验约束。例如:默认值、校验范围、描述文档、示例、别名等。
2
Typing 模块
python Python 的 typing 模块是用于类型提示(Type Hints)的标准库,自 Python 3.5 起引入。它不会在运行时强制类型检查,但可以配合工具(如 mypy、IDE 等)提升代码可读性、健壮性和开发效率。
3
Json 模块的常用方法
python JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python的json模块提供了处理JSON数据的工具,主要包括以下功能:
1.序列化:将Python对象转换为JSON格式字符串。
2.反序列化:将JSON格式字符串转换为Python对象。
4
如何使用 Obsidian 管理散落各处的 MD 文件、文件夹
Obsidian 在 Windows 系统中,软链接(Symbolic Link) 是一种特殊的文件或目录,它指向另一个文件或目录。通过软链接,可以方便地访问目标文件或目录,而无需复制实际内容。
5
Context Engine
AI 上下文工程是为模型构建动态信息环境的系统性方法。它确保 Agent 在执行复杂任务时,能按需获取最相关的信息,包括用户指令、对话历史、外部数据和工具反馈等。
随机文章 随机推荐