元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Python基础语法
Python环境安装与配置
第一个Python程序
变量与数据类型
字面量详解
基本运算符
流程控制语句
包管理与虚拟环境
▶
Python数据结构
列表(List)详解
元组(Tuple)使用指南
字典(Dict)完全解析
集合(Set)操作大全
▶
函数与模块
函数定义与参数传递
Lambda表达式
模块导入与使用
常用内置函数
▶
面向对象编程
类与对象
继承与多态
魔术方法解析
装饰器原理与应用
▶
Python类型系统
类型注解(Type Hints)
Pydantic基础
Pydantic高级特性
typing模块基础
泛型类型详解
泛型类详解
Callable类型详解
Awaitable类型详解
类型变量与约束
类型别名与Protocol
TypedDict详解
Annotated类型
Reducer类型
类型检查工具使用
类型注解最佳实践
▶
关键字
pass关键字
raise关键字
global关键字
nonlocal关键字
yield关键字
assert关键字
with关键字
async/await关键字
▶
包管理
pip包管理基础
虚拟环境管理
包管理工具对比
requirements.txt规范
依赖管理与requirements.txt
setup.py配置说明
Poetry项目管理工具
Conda包管理系统
打包与发布Python包
PyPI发布流程
私有PyPI仓库
▶
Python高级特性
迭代器与生成器
多线程编程
协程与异步IO
元编程入门
反射机制详解
描述符协议
上下文管理器协议
垃圾回收机制
内存管理深度解析
性能优化指南
▶
文件与异常处理
文件读写操作
JSON数据解析
异常处理机制
上下文管理器
发布时间:
2025-03-29 16:14
↑
☰
# Pydantic高级特性 ## 自定义验证器 ### 1. 字段验证器 ```python from pydantic import BaseModel, validator, Field class Product(BaseModel): name: str = Field(..., min_length=1) price: float = Field(..., gt=0) quantity: int = Field(..., ge=0) @validator('name') def name_must_be_valid(cls, v): if v.strip() == '': raise ValueError('名称不能为空白') return v.strip() @validator('price') def price_must_be_reasonable(cls, v): if v > 1000000: raise ValueError('价格不能超过100万') return round(v, 2) ``` ### 2. 依赖验证器 ```python from pydantic import BaseModel, validator from typing import List class Order(BaseModel): items: List[str] total: float discount: float = 0.0 final_price: float @validator('discount') def discount_must_be_valid(cls, v): if not 0 <= v <= 1: raise ValueError('折扣必须在0到1之间') return v @validator('final_price', always=True) def calculate_final_price(cls, v, values): if 'total' not in values or 'discount' not in values: raise ValueError('需要total和discount来计算final_price') return values['total'] * (1 - values['discount']) ``` ## 复杂类型处理 ### 1. 自定义类型 ```python from pydantic import BaseModel, constr from datetime import datetime from typing import NewType, List # 自定义类型 PhoneNumber = NewType('PhoneNumber', str) PositiveInt = NewType('PositiveInt', int) class Contact(BaseModel): name: constr(min_length=2, max_length=50) phone: PhoneNumber age: PositiveInt tags: List[str] = [] @validator('phone') def validate_phone(cls, v): if not v.startswith('+') or not v[1:].isdigit(): raise ValueError('无效的电话号码格式') return v ``` ### 2. 泛型模型 ```python from typing import TypeVar, Generic, List from pydantic import BaseModel, Field from pydantic.generics import GenericModel T = TypeVar('T') class Response(GenericModel, Generic[T]): code: int = Field(200, description='状态码') message: str = '成功' data: T class User(BaseModel): id: int name: str # 使用泛型模型 user_response = Response[User](data=User(id=1, name='张三')) list_response = Response[List[User]](data=[User(id=1, name='张三')]) ``` ## 序列化与反序列化 ### 1. 自定义序列化 ```python from pydantic import BaseModel from datetime import datetime from typing import Any class Event(BaseModel): id: int title: str timestamp: datetime class Config: json_encoders = { datetime: lambda v: v.strftime('%Y-%m-%d %H:%M:%S') } def json(self, **kwargs): # 自定义JSON序列化 json_data = super().json(**kwargs) return json_data ``` ### 2. 模型导出配置 ```python from pydantic import BaseModel from typing import Optional class UserProfile(BaseModel): id: int username: str email: str _password: str internal_id: str class Config: # 字段别名 fields = { 'internal_id': 'user_id' } # 排除私有字段 exclude = {'_password'} # 允许从ORM对象创建 orm_mode = True ``` ## 高级配置选项 ### 1. 模型配置 ```python from pydantic import BaseModel, Field from typing import Optional class AdvancedConfig(BaseModel): name: str value: Optional[str] = None class Config: # 允许填充额外字段 extra = 'allow' # 验证所有赋值 validate_assignment = True # 允许种群变异 validate_all = True # 使用枚举值 use_enum_values = True # 允许自定义验证器修改值 validate_default = True ``` ### 2. 动态模型生成 ```python from pydantic import create_model, Field def create_dynamic_model(fields): # 动态创建模型 field_definitions = { name: (type_, Field(...)) for name, type_ in fields.items() } return create_model('DynamicModel', **field_definitions) # 使用示例 fields = { 'name': str, 'age': int, 'is_active': bool } DynamicUser = create_dynamic_model(fields) ``` ## 最佳实践 ### 1. 性能优化 ```python from pydantic import BaseModel, validator from typing import Dict, Any class OptimizedModel(BaseModel): # 使用__slots__优化内存使用 __slots__ = ['__dict__', '__fields_set__'] data: Dict[str, Any] class Config: # 禁用额外验证以提高性能 extra = 'ignore' # 验证默认值 validate_default = False ``` ### 2. 错误处理 ```python from pydantic import BaseModel, ValidationError from typing import List, Optional class ErrorHandler(BaseModel): name: str items: List[str] metadata: Optional[dict] = None @classmethod def safe_parse(cls, data: dict): try: return cls(**data) except ValidationError as e: # 自定义错误处理 errors = e.errors() return { 'success': False, 'errors': [{ 'field': error['loc'][0], 'message': error['msg'] } for error in errors] } ``` ### 3. 集成测试 ```python from pydantic import BaseModel import pytest class TestModel(BaseModel): name: str age: int def test_model_validation(): # 正确的数据 valid_data = {'name': '张三', 'age': 25} model = TestModel(**valid_data) assert model.name == '张三' assert model.age == 25 # 错误的数据 with pytest.raises(ValidationError): TestModel(name='李四', age='invalid') ```