元素码农
基础
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 12:05
↑
☰
# Python泛型类型详解 ## 什么是泛型? 泛型是一种代码复用的方式,它允许我们编写可以处理多种类型的代码,同时保持类型安全。在Python中,我们使用typing模块来实现泛型编程。 ## 内置泛型类型 ### 容器类型 ```python from typing import List, Dict, Tuple, Set # List泛型 def process_numbers(numbers: List[float]) -> float: return sum(numbers) # Dict泛型 def get_user_data(data: Dict[str, Any]) -> str: return data.get('name', '') # Tuple泛型 def get_coordinates(point: Tuple[float, float]) -> float: x, y = point return (x ** 2 + y ** 2) ** 0.5 # Set泛型 def unique_elements(items: Set[int]) -> int: return len(items) ``` ### 嵌套泛型类型 ```python from typing import List, Dict # 嵌套列表 Matrix = List[List[float]] def matrix_sum(matrix: Matrix) -> float: return sum(sum(row) for row in matrix) # 复杂字典结构 UserData = Dict[str, Dict[str, Union[str, int, List[str]]]] def process_user_data(data: UserData) -> None: for user_id, info in data.items(): name = info.get('name', '') age = info.get('age', 0) print(f"User {name} is {age} years old") ``` ## 自定义泛型类 ### 基本泛型类 ```python from typing import TypeVar, Generic T = TypeVar('T') class Box(Generic[T]): def __init__(self, item: T) -> None: self.item = item def get(self) -> T: return self.item def set(self, item: T) -> None: self.item = item # 使用示例 int_box = Box[int](42) str_box = Box[str]("Hello") ``` ### 多类型参数 ```python from typing import TypeVar, Generic K = TypeVar('K') V = TypeVar('V') class Pair(Generic[K, V]): def __init__(self, key: K, value: V) -> None: self.key = key self.value = value def get_key(self) -> K: return self.key def get_value(self) -> V: return self.value # 使用示例 pair = Pair[str, int]("age", 25) ``` ### 泛型约束 ```python from typing import TypeVar, Generic from numbers import Number T = TypeVar('T', bound=Number) class NumericBox(Generic[T]): def __init__(self, value: T) -> None: self.value = value def add(self, other: T) -> T: return self.value + other # 使用示例 int_box = NumericBox[int](5) float_box = NumericBox[float](3.14) ``` ## 泛型函数 ### 基本泛型函数 ```python from typing import TypeVar, Sequence T = TypeVar('T') def first(seq: Sequence[T]) -> T: if not seq: raise ValueError("Sequence is empty") return seq[0] # 使用示例 first([1, 2, 3]) # 返回 1 first("hello") # 返回 'h' ``` ### 多类型参数函数 ```python from typing import TypeVar, Sequence T = TypeVar('T') S = TypeVar('S') def map_sequence(seq: Sequence[T], func: Callable[[T], S]) -> List[S]: return [func(item) for item in seq] # 使用示例 result = map_sequence([1, 2, 3], str) # ['1', '2', '3'] ``` ## 最佳实践 1. 明确类型参数 ```python # 好的做法 def process_items(items: List[T]) -> List[T]: return sorted(items) # 避免过于宽泛 def process_items(items: List[Any]) -> List[Any]: # 不推荐 return sorted(items) ``` 2. 合理使用约束 ```python from typing import TypeVar, Comparable T = TypeVar('T', bound=Comparable) def find_max(items: List[T]) -> T: return max(items) ``` 3. 文档化泛型用法 ```python from typing import TypeVar, Generic T = TypeVar('T') class Stack(Generic[T]): """A generic stack implementation. Type Parameters: T: The type of elements stored in the stack. """ def __init__(self) -> None: self.items: List[T] = [] ``` ## 注意事项 1. 运行时类型擦除 - Python的泛型类型在运行时会被擦除 - 类型检查主要在开发阶段进行 - 不要依赖运行时的类型信息 2. 向后兼容性 - 泛型类型注解不影响Python 2代码 - 可以逐步引入泛型类型 - 保持代码的可读性和可维护性 3. IDE支持 - 现代IDE对泛型类型有良好支持 - 利用IDE的类型提示功能 - 使用类型检查工具验证泛型使用 ## 总结 Python的泛型类型系统为我们提供了强大的工具来编写类型安全的可重用代码。通过合理使用泛型,我们可以: - 提高代码的复用性和可维护性 - 在编译时捕获类型错误 - 提供更好的代码文档和IDE支持 在下一篇文章中,我们将探讨类型变量和约束的高级用法,敬请期待!