Python Typing Hints如何复用单个Vector别名替代两个不同的Vector别名
解决方案
完全可以通过泛型类型别名实现单个Vector复用,不需要分别定义两个类型别名,核心是借助TypeVar声明泛型占位符,修改后的代码逻辑如下:
- 首先声明无边界的泛型类型变量
T,作为Vector存储元素的类型占位 - 把Vector定义为接收泛型参数的联合类型,适配列表、集合、元组、冻结集合四类容器
- 使用时给Vector传入对应的元素类型参数即可,不需要重复定义别名
补充说明:你原有代码中
Tuple[Number]的写法仅代表只有单个数值的元组,如果需要适配任意长度的同类型元素元组,要改为Tuple[T, ...]的写法,...表示任意数量的前置类型元素。
修改后的完整代码:
from typing import Union, TypeVar, List, Set, Tuple, FrozenSet Number = Union[int, float] # 声明泛型占位符 T = TypeVar('T') # 定义泛型Vector类型别名,可适配任意元素类型的四类容器 Vector = Union[List[T], Set[T], Tuple[T, ...], FrozenSet[T]] def mean(vector: Vector[Number]) -> Number: return sum(vector) / len(vector) def readPrint(vector: Vector[str]) -> None: for i in vector: print(i)
如果你需要限制Vector只能接收数值或字符串类型的元素,也可以给TypeVar加上边界约束:T = TypeVar('T', bound=Union[Number, str]),避免其他不兼容类型被错误传入。
内容的提问来源于stack exchange,提问作者Amâncio de Noronha Brito
相关产品推荐
相关产品推荐

