如何在Python中为嵌套泛型定义TypeAlias?
解决泛型类型别名的绑定问题
核心解决方案
要让Grid成为可参数化的泛型类型别名,从而实现Grid[T]的写法,有两种实用方式:
1. Python 3.10+ 推荐写法
使用typing.TypeAlias明确声明泛型别名,语法更直观:
from typing import TypeVar, Sequence, Iterable, TypeAlias T = TypeVar("T") Grid: TypeAlias = Sequence[Sequence[T]] def columns(grid: Grid[T]) -> Iterable[list[T]]: return ([row[i] for row in grid] for i in range(len(grid[0])))
2. 兼容Python 3.9及更早版本
用GenericAlias手动创建泛型别名实例,适配旧版本环境:
from typing import TypeVar, Sequence, Iterable, GenericAlias T = TypeVar("T") Grid = GenericAlias(Sequence, (Sequence[T],)) def columns(grid: Grid[T]) -> Iterable[list[T]]: return ([row[i] for row in grid] for i in range(len(grid[0])))
原写法的问题原因
你之前的Grid = Sequence[Sequence[T]]是将Grid绑定到了使用当前T的具体类型,而非可复用的泛型模板。此时函数中的Grid和返回值的T是两个独立的类型变量,无法建立关联。而泛型类型别名允许你在使用时显式传入类型参数(Grid[T]),确保输入输出的T指向同一个类型变量。
内容的提问来源于stack exchange,提问作者Chris Wesseling
相关产品推荐
相关产品推荐

