You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用可变元组类型参数注解接收类型元组并返回其一类型的函数?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 06:42:37