python 3.12+ 支持类名后用方括号直接声明多泛型参数,如 class map[k, v]:,无需导入 typevar 或继承 generic;类型别名需用 type pair[k, v] = tuple[k, v];泛型仅用于静态检查,不支持协变/逆变。

多泛型参数的定义方式
Python 3.12+ 支持在类名后用方括号直接声明多个类型参数,语法为 class ClassName[Param1, Param2, ...]:。不需要导入 TypeVar 或继承 Generic,解释器在语法层面就能识别。
- 参数名可自定义,常见惯例是
K(key)、V(value)、T(type)、E(element)等,但无强制语义约束 - 顺序由你定义,比如
Map[K, V]中 K 在前、V 在后,仅表示你约定第一个是键类型、第二个是值类型 - 必须带方括号:
class Pair[K, V]:✅;class Pair:❌(变成普通类)
多参数泛型类的使用示例
以键值对容器为例:
class Map[K, V]:
def __init__(self):
self._data: dict[K, V] = {}
def set(self, key: K, value: V) -> None:
self._data[key] = value
def get(self, key: K) -> V | None:
return self._data.get(key)
- 实例化时可显式标注:
user_map: Map[str, int] = Map() - 也可省略类型参数,由 mypy 自动推断:
m = Map(); m.set("age", 25)→ 推断为Map[str, int] - 传入不匹配类型会触发静态检查报错:
m.set(42, "hello")→Argument 1 to "set" has incompatible type "int"; expected "str"
泛型类型别名也支持多参数
定义泛型别名时,必须加 type 关键字,且类型参数需与右侧一致:
- ✅ 正确:
type Pair[K, V] = tuple[K, V]——Pair[str, bool]等价于tuple[str, bool] - ✅ 正确:
type DictList[K, V] = dict[K, list[V]] - ❌ 错误:
Pair[K, V] = tuple[K, V]→NameError: name 'K' is not defined - ❌ 半正确:
Pair = tuple[K, V]→ 运行不报错,但 mypy 不识别泛型语义,无法做类型推导
注意事项与常见误区
多参数泛型仍遵循 Python 泛型的基本规则:
- 类型参数作用域仅限于该类或别名定义内部,类外不能直接引用
K或V - 运行时不做强制:泛型只服务于静态检查和 IDE 提示,不会拦截类型错误
- 不支持协变/逆变声明(如
+K/-V)——这是TypeVar的能力,新语法暂未提供,需回退旧写法 - 若需约束(如
K必须是Hashable),目前仍需用TypeVar("K", bound=Hashable)+Generic[K, V]组合











