如何为可参数化Union创建Python类型别名(Python≥3.10)
解决方法
要创建支持参数化的联合类型别名,你需要先定义一个类型变量,再把它绑定到每个泛型容器的参数上,最后组合成联合类型。Python 3.10+可以这么写:
from typing import TypeVar, TypeAlias # 定义一个可复用的类型变量 T = TypeVar('T') # 用类型变量T绑定每个容器的泛型参数,再组合成联合类型别名 MyType: TypeAlias = list[T] | tuple[T, ...] | set[T] | frozenset[T]
用法示例
现在你可以像预想的那样给变量做类型注解了:
x: MyType[str] = ["foo", "bar"] y: MyType[str] = ("baz", "bar") # 元组也符合要求 z: MyType[int] = {1, 7, 42} # 集合同样适用
为什么之前的写法报错?
你之前直接把list | tuple | set | frozenset当成泛型用,本质是给未绑定类型变量的泛型类型做了联合,这类组合本身不具备泛型参数化的能力——类型检查器不知道要把[str]传递给哪个泛型的参数。而上面的写法是先让每个容器都绑定同一个类型变量T,再把它们组合成联合,这样整个别名就变成了可以接受参数的泛型类型。
注意:如果你的需求是固定长度的元组(比如
tuple[str]表示单元素字符串元组),可以把tuple[T, ...]改成tuple[T],不过通常场景下tuple[T, ...]表示任意长度的同类型元组,更符合大多数需求。
内容的提问来源于stack exchange,提问作者Sven Eberth
相关产品推荐
相关产品推荐

