元素码农
基础
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 15:15
↑
☰
# Annotated类型详解 ## 什么是Annotated类型 Annotated是Python 3.9引入的一个特殊类型构造器,它允许我们为类型添加额外的元数据信息。这些元数据可以被静态类型检查器、IDE或运行时代码使用,使类型注解更加丰富和实用。 ## 基本语法 ### 定义Annotated类型 ```python from typing import Annotated # 基本语法:Annotated[类型, 元数据1, 元数据2, ...] UserId = Annotated[int, "用户ID必须是正整数"] Password = Annotated[str, "密码长度至少8位"] def create_user(user_id: UserId, password: Password) -> None: if user_id <= 0: raise ValueError("用户ID必须是正整数") if len(password) < 8: raise ValueError("密码长度至少8位") ``` ## 常见应用场景 ### 1. 参数验证 ```python from typing import Annotated from pydantic import BaseModel, Field class User(BaseModel): name: Annotated[str, Field(min_length=2, max_length=50)] age: Annotated[int, Field(ge=0, le=150)] email: Annotated[str, Field(regex=r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")] # Pydantic会自动使用注解中的验证规则 user = User(name="张三", age=25, email="zhangsan@example.com") ``` ### 2. 依赖注入 ```python from typing import Annotated from fastapi import Depends, FastAPI from sqlalchemy.orm import Session app = FastAPI() def get_db(): db = SessionLocal() try: yield db finally: db.close() # 使用Annotated定义依赖注入 DB = Annotated[Session, Depends(get_db)] @app.get("/users/{user_id}") def get_user(user_id: int, db: DB): return db.query(User).filter(User.id == user_id).first() ``` ### 3. 单位和范围标注 ```python from typing import Annotated from dataclasses import dataclass # 定义单位类型 Meters = Annotated[float, "meters"] Seconds = Annotated[float, "seconds"] KilometersPerHour = Annotated[float, "km/h"] @dataclass class Movement: distance: Meters time: Seconds speed: KilometersPerHour # 使用带单位的类型 def calculate_arrival_time(distance: Meters, speed: KilometersPerHour) -> Seconds: return distance / (speed * 1000 / 3600) ``` ## 高级用法 ### 1. 自定义验证器 ```python from typing import Annotated from functools import wraps def validate_range(min_val: float, max_val: float): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): for arg in args: if isinstance(arg, (int, float)): if not min_val <= arg <= max_val: raise ValueError(f"值必须在{min_val}和{max_val}之间") return func(*args, **kwargs) return wrapper return decorator # 使用自定义验证器 Percentage = Annotated[float, validate_range(0, 100)] def set_volume(volume: Percentage) -> None: print(f"设置音量为: {volume}%") ``` ### 2. 组合注解 ```python from typing import Annotated, Union from pydantic import Field # 组合多个类型注解 UserInput = Annotated[ Union[str, int], Field(description="用户输入"), "可以是字符串或整数" ] def process_input(data: UserInput) -> str: return str(data).upper() ``` ## 最佳实践 1. **清晰的元数据**: - 使用描述性的元数据 - 避免过度复杂的注解 ```python # 好的做法 PositiveInt = Annotated[int, "必须是正整数"] Email = Annotated[str, "有效的电子邮件地址"] # 避免的做法 ComplexType = Annotated[int, "正整数", "范围0-100", "步长2", "其他规则..."] # 过于复杂 ``` 2. **模块化组织**: - 将常用的Annotated类型定义在单独的模块中 - 使用类型别名提高可读性 ```python # types.py from typing import Annotated PositiveInt = Annotated[int, "必须是正整数"] NonEmptyStr = Annotated[str, "不能为空字符串"] # 在其他模块中使用 from .types import PositiveInt, NonEmptyStr def create_item(id: PositiveInt, name: NonEmptyStr) -> None: pass ``` 3. **文档化**: - 为自定义的Annotated类型添加清晰的文档 - 说明验证规则和使用注意事项 ## 注意事项 1. **性能考虑**: - Annotated类型的验证可能会带来运行时开销 - 在性能关键的代码中谨慎使用复杂的验证逻辑 2. **兼容性**: - 确保使用的类型检查器支持Annotated - 考虑Python版本兼容性(3.9+) 3. **可读性平衡**: - 避免过度使用Annotated导致代码难以理解 - 保持注解简洁明了 ## 总结 Annotated类型是Python类型系统中的一个强大特性,它能够: - 为类型添加丰富的元数据 - 支持参数验证和依赖注入 - 提高代码的可维护性和可读性 - 增强IDE和类型检查器的功能 合理使用Annotated类型可以帮助我们编写更加健壮和可维护的代码。通过本文的学习,你应该能够掌握Annotated类型的基本用法和高级特性,并在实际项目中正确运用这一工具。