本文详细介绍了 Python 泛型的用法,并通过大量代码示例展示如何在 Python 中使用泛型进行类型安全编程。同时,我们也会对比 Java 的泛型机制,帮助你更好地理解两者的区别。
1. 为什么需要泛型?
Python 是一门动态语言,但在大型项目中,为了提高代码的可维护性和减少 Bug,我们通常会使用类型提示 (Type Hints)。泛型允许我们在定义函数、类或接口时,不指定具体的数据类型,而是在使用时再指定。
主要好处:
- 类型安全:静态类型检查器(如
mypy)可以在运行前发现类型错误。 - 代码复用:一套逻辑可以应用于多种数据类型。
- IDE 智能提示:更好的自动补全和代码导航。
2. 基础概念与语法
2.1 定义类型变量 (TypeVar)
在 Python 中(3.12 之前),泛型的核心是 TypeVar。必须先定义一个类型变量对象,才能在后续代码中使用它。
from typing import TypeVar, List
# 定义一个类型变量 T
# 习惯上变量名和字符串参数保持一致
T = TypeVar('T')
2.2 泛型函数
一个简单的例子:实现一个函数,返回列表中的第一个元素。
from typing import TypeVar, List
T = TypeVar('T')
def get_first(items: List[T]) -> T:
"""返回列表的第一个元素,类型与列表元素类型一致"""
return items[0]
# 使用示例
n: int = get_first([1, 2, 3]) # T 被推断为 int
s: str = get_first(["a", "b"]) # T 被推断为 str
# IDE 会报错的例子
# x: str = get_first([1, 2, 3]) # 错误:期望返回 int,但标记为 str
2.3 泛型类
使用 Generic[T] 基类来定义泛型类。

