如何用可变元组类型参数注解接收类型元组并返回其一类型的函数?
Python 类型注解:可变长度类型元组的函数注解实现
你想要的这种用可变泛型参数直接展开的写法(func[*Ts])目前不能直接这样写,但Python 3.11+ 引入的PEP 646可变泛型特性可以实现相同的效果,不用手动写一堆@overload。
正确实现方式
先导入必要的类型工具,然后用TypeVarTuple和Unpack来定义:
from typing import TypeVarTuple, Unpack, Type, Union Ts = TypeVarTuple('Ts') def func[*Ts](types: tuple[Type[Unpack[Ts]]]) -> Union[Unpack[Ts]]: # 示例实现:随机返回一个传入类型的实例 import random return random.choice(types)()
效果说明
TypeVarTuple('Ts')定义了一个可变的类型元组变量*Ts表示函数接收任意数量的类型参数tuple[Type[Unpack[Ts]]]约束传入的参数是一个元组,元素对应Ts中每个类型的Type对象Union[Unpack[Ts]]表示返回值是Ts中所有类型的联合类型
这个写法和你手动写多个@overload的效果完全一致,而且支持任意长度的类型元组,不用逐个覆盖不同长度的情况。
注意事项
- 该特性需要Python 3.11及以上版本
- 类型检查器(如mypy、pyright)需支持PEP 646(主流检查器新版本默认支持)
- 若要兼容低版本Python或不支持PEP 646的检查器,仍需使用你最初的
@overload写法,逐个定义不同长度的元组场景。
内容的提问来源于stack exchange,提问作者Alek
相关产品推荐
相关产品推荐

