元素码农
基础
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基础教程 ## 什么是Pydantic Pydantic是一个基于Python类型注解的数据验证库,它可以: - 强制数据类型转换 - 数据验证 - 序列化和反序列化 - 导出模型文档 ## 基本使用 ### 1. 定义模型 ```python from pydantic import BaseModel from typing import List, Optional class User(BaseModel): id: int name: str email: str age: Optional[int] = None tags: List[str] = [] # 创建用户实例 user = User( id=1, name="张三", email="zhangsan@example.com", tags=["python", "developer"] ) ``` ### 2. 数据验证 ```python from pydantic import BaseModel, EmailStr, conint, constr class UserProfile(BaseModel): username: constr(min_length=3, max_length=50) age: conint(ge=0, le=150) email: EmailStr bio: Optional[str] = None # 验证会自动进行 try: user = UserProfile( username="ab", # 会引发错误:长度太短 age=200, # 会引发错误:超出范围 email="invalid" # 会引发错误:邮箱格式无效 ) except ValueError as e: print(f"验证错误:{e}") ``` ### 3. 嵌套模型 ```python from typing import List from pydantic import BaseModel class Address(BaseModel): street: str city: str country: str class User(BaseModel): name: str addresses: List[Address] # 使用嵌套模型 user = User( name="李四", addresses=[ {"street": "中关村", "city": "北京", "country": "中国"}, {"street": "浦东", "city": "上海", "country": "中国"} ] ) ``` ## 高级特性 ### 1. 字段验证器 ```python from pydantic import BaseModel, validator class User(BaseModel): name: str password: str password_confirm: str @validator('password') def password_strength(cls, v): if len(v) < 8: raise ValueError('密码长度必须至少8位') if not any(c.isupper() for c in v): raise ValueError('密码必须包含大写字母') return v @validator('password_confirm') def passwords_match(cls, v, values): if 'password' in values and v != values['password']: raise ValueError('两次输入的密码不匹配') return v ``` ### 2. 配置和自定义行为 ```python from pydantic import BaseModel class User(BaseModel): name: str age: int class Config: # 允许从ORM对象创建模型 orm_mode = True # 验证赋值 validate_assignment = True # 允许额外字段 extra = 'allow' # 使用配置 user = User(name="王五", age=30, extra_field="value") ``` ### 3. 类型转换 ```python from datetime import datetime from pydantic import BaseModel class Event(BaseModel): name: str date: datetime participants: int # Pydantic会自动转换合适的数据类型 event = Event( name="Python研讨会", date="2024-01-01T10:00:00", # 字符串会被转换为datetime participants="50" # 字符串会被转换为整数 ) ``` ## 最佳实践 1. 使用类型注解 - 总是使用类型注解来定义字段 - 使用Optional表示可选字段 - 为字段提供默认值 2. 错误处理 - 使用try/except捕获验证错误 - 自定义错误消息 - 在API中优雅处理验证错误 3. 性能优化 - 避免过度使用验证器 - 使用Config类优化行为 - 合理设置字段约束 ## 常见用例 1. API请求验证 ```python from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class UserCreate(BaseModel): username: str email: str password: str @app.post("/users/") def create_user(user: UserCreate): # FastAPI会自动使用Pydantic进行请求验证 return {"message": "用户创建成功"} ``` 2. 配置管理 ```python from pydantic import BaseSettings class Settings(BaseSettings): database_url: str api_key: str debug: bool = False class Config: env_file = ".env" # 从环境变量加载配置 settings = Settings() ``` 3. 数据转换 ```python from pydantic import BaseModel from datetime import datetime class Article(BaseModel): title: str content: str created_at: datetime tags: List[str] def to_json(self): return self.json() def to_dict(self): return self.dict() ```