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: int
name: str
email: str
age: 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 Optional
from pydantic import BaseModel, ValidationError, field_validator
class UserWithValidator(BaseModel):
id: int
name: str
email: str
age: Optional[int] = None
# 针对业务进行复杂逻辑校验
@field_validator('age')
@classmethod
def 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]
4-Secret敏感字符
from pydantic import Secret
# 1-定义dict信息
user_data_log = {
'id': '123',
'name': 'Bob',
'email': Secret('bob@example.com')
}
# 打印dict信息:{'id': '123', 'name': 'Bob', 'email': Secret('**********')}
print(f"validate_user_auto->", user_data_log)
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 Optional
class User(BaseModel):
id: int
name: str
email: str
age: 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 Optional
from pydantic import BaseModel, ValidationError, field_validator
class UserWithValidator(BaseModel):
id: int
name: str
email: str
age: Optional[int] = None
@field_validator('age')
@classmethod
def 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 大大简化了数据处理的复杂性,提高了代码的健壮性和可维护性。
3-pydantic单词解释
Pydantic 的命名其实是个双关语(pun),结合了 Python 和 Pedantic 两个词:
1-拆解命名来源:
| 部分 | 含义 |
|---|---|
| Py- | 来自 Python,表明这是为 Python 设计的库。 |
| -dantic | 来自 Pedantic,意为“迂腐的”、“过分注重细节的”。 |
2-为什么用“Pedantic”?
Pydantic 的核心目标是对数据类型和结构进行严格、细致的验证,就像个“迂腐的学究”一样,容不得半点类型错误或字段缺失。
所以作者 Samuel Colvin 用“Pedantic”来形容这种严格、吹毛求疵的验证风格,非常贴切。
3-总结一句话:
Pydantic = Python + Pedantic,意思是“用 Python 写的、对数据验证极其严格的库”。
4-小彩蛋:
这种命名方式在 Python 社区挺常见,比如:
- PyLint(Python + Lint)
- PyTest(Python + Test)
- PyArrow(Python + Arrow,Arrow 是列式内存格式)
Pydantic 的命名不仅有趣,还精准传达了它的设计理念:严格、清晰、可靠。
更多推荐

所有评论(0)