Python-pydantic校验
Python-pydantic校验

1-知识整理
1-UV 环境管理
# 1-查看并指定环境
uv python list
uv python pin 3.10# 2-进行项目创建
uv init hello-pydantic && cd hello-pydantic# 3-指定本地运行环境
uv venv && source .venv/bin/activate# 4-本地环境安装依赖
uv pip install pydantic
2-pydantic功能
1-将dict转化为对象[校验必填+自动类型转化]
- 校验必填->必填字段没有赋值就报错
- 自动类型转化->string可以自定转化为int【前提是可以转】
# 使用pydantic定义Dict数据类型
class User(BaseModel):id: intname: stremail: strage: Optional[int] = None# 字符串 '123' 会被自动转换为整数 123
user_data_auto = {'id': '123','name': 'Bob','email': 'bob@example.com'
}# 将dict转化为对象[校验必填+自动类型转化]
user_auto = User(**user_data_auto)
print(f"validate_user_auto->", user_auto)
2- JSON 序列化
类比Java中的JsonUtil类,将【对象】【Map】【JsonString】进行互相转化
1-【对象->jsonString】->user_json_string = user.json()
2-【jsonString->对象】->user_from_json = User.parse_raw(user_json_string)
# 1-先准备对象数据(dict->对象)
user = User(**user_dict_data)# 2-对象实例转JSON(对象->jsonString)
user_json_string = user.json()
print(user_json_string)
# 输出: {"id": 1, "name": "Alice", "email": "alice@example.com", "age": 25}# 3-JSON 转模型实例(jsonString->对象)
user_from_json = User.parse_raw(user_json_string)
print(user_from_json)
# 输出: id=1 name='Alice' email='alice@example.com' age=25
3-字段复杂逻辑判断
from typing import Optionalfrom pydantic import BaseModel, ValidationError, field_validatorclass UserWithValidator(BaseModel):id: intname: stremail: strage: Optional[int] = None# 针对业务进行复杂逻辑校验@field_validator('age')@classmethoddef validate_age(cls, v: int) -> int:if v < 18:raise ValueError('Age must be at least 18')return v# 测试验证器
try:user_invalid_age = UserWithValidator(id=1, age=10, name='Dave', email='invalid-email')
except ValidationError as e:print(e)# 输出:# 1 validation error for UserWithValidator# age# Value error, Age must be at least 18 [type=value_error, input_value=10, input_type=int]
2-pydantic校验详解
Pydantic 是一个在 Python 中用于数据验证和解析的库,它通过 Python 的类型注解(type hints)来定义数据模型,并自动进行数据验证、类型转换和序列化。Pydantic 的核心是 BaseModel 类,它允许你以类属性的方式定义字段,并自动处理数据验证。
Pydantic 的主要特点包括:
- 类型安全:利用 Python 的类型注解,确保数据类型正确。
- 自动验证:自动验证输入数据是否符合模型定义。
- 错误处理:提供详细的错误信息,方便调试。
- 性能高效:使用 Cython 优化,性能优越。
- JSON 支持:轻松实现 JSON 序列化和反序列化。
安装 Pydantic
你可以使用 pip 安装 Pydantic:
pip install pydantic
基本使用示例
以下是使用 Pydantic 的最常用方法代码示例:
1. 定义模型
from pydantic import BaseModel, ValidationError
from typing import Optionalclass User(BaseModel):id: intname: stremail: strage: Optional[int] = None
2. 创建模型实例
# 正确数据
user_data = {'id': 1,'name': 'Alice','email': 'alice@example.com','age': 25
}user = User(**user_data)
print(user)
# 输出: id=1 name='Alice' email='alice@example.com' age=25
3. 自动类型转换
# 字符串 '123' 会被自动转换为整数 123
user_data_auto = {'id': '123','name': 'Bob','email': 'bob@example.com'
}user_auto = User(**user_data_auto)
print(user_auto)
# 输出: id=123 name='Bob' email='bob@example.com' age=None
4. 数据验证
# 错误数据,缺少必填字段
invalid_data = {'id': 1,'name': 'Charlie'
}try:user_invalid = User(**invalid_data)
except ValidationError as e:print(e)# 输出:# 1 validation error for User# email# field required (type=value_error.missing)
5. JSON 序列化
# 模型实例转 JSON
user_json = user.json()
print(user_json)
# 输出: {"id": 1, "name": "Alice", "email": "alice@example.com", "age": 25}# JSON 转模型实例
user_from_json = User.parse_raw(user_json)
print(user_from_json)
# 输出: id=1 name='Alice' email='alice@example.com' age=25
6. 字段验证器(可选)
from typing import Optionalfrom pydantic import BaseModel, ValidationError, field_validatorclass UserWithValidator(BaseModel):id: intname: stremail: strage: Optional[int] = None@field_validator('age')@classmethoddef validate_age(cls, v: int) -> int:if v < 18:raise ValueError('Age must be at least 18')return v# 测试验证器
try:user_invalid_age = UserWithValidator(id=1, age=10, name='Dave', email='invalid-email')
except ValidationError as e:print(e)# 输出:# 1 validation error for UserWithValidator# age# Value error, Age must be at least 18 [type=value_error, input_value=10, input_type=int]
总结
Pydantic 是一个功能强大且易于使用的库,适用于任何需要数据验证和解析的场景,如 Web 开发(FastAPI 就是基于 Pydantic)、配置文件解析、API 数据交互等。通过类型注解和自动验证,Pydantic 大大简化了数据处理的复杂性,提高了代码的健壮性和可维护性。
