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

如何利用Python TypeVarTuple实现泛型类的多类型参数类型注解?

用TypeVarTuple实现可变类型参数的泛型类

你的需求完全可以通过Python类型提示实现,核心是正确使用TypeVarTuple和Unpack来标注可变数量的类型对应的列表元组。以下是修正后的代码和说明:

正确实现代码

from typing import Generic, Tuple, List
from typing_extensions import TypeVarTuple, Unpack

Ts = TypeVarTuple('Ts')

class Test(Generic[Unpack[Ts]]):
    def __init__(self) -> None:
        # 类型注解:元组中每个元素对应Ts类型参数的List
        self.content: Tuple[List[Unpack[Ts]]] = ()

    def call(self, *values: Unpack[Tuple[List[t] for t in Ts]]) -> None:
        for v, c in zip(values, self.content):
            c.extend(v)

class Implementation(Test[int, str, int]):
    def __init__(self) -> None:
        # 子类中显式初始化对应数量的空列表,保证类型和数量匹配
        self.content: Tuple[List[int], List[str], List[int]] = ([], [], [])

i = Implementation()
i.call([1, 2, 3], [], [2])  # 类型检查通过
# i.call([1, "2"], [], [2])  # 类型检查报错:第一个参数应为List[int]

关键修正点

  1. 类泛型声明:Generic[Unpack[Ts]]让类支持可变数量的泛型类型参数,比如Test[int, str, int]就对应三个类型参数。
  2. content类型注解:Tuple[List[Unpack[Ts]]]明确标注self.content是一个元组,每个元素是对应Ts中类型的列表,比如Test[int, str, int]对应的content类型是Tuple[List[int], List[str], List[int]]。
  3. call方法参数:*values: Unpack[Tuple[List[t] for t in Ts]]指定方法接收可变数量的参数,每个参数的类型必须与Ts对应位置的列表类型匹配,类型检查器会自动验证传入参数的合法性。
  4. 运行时初始化:由于TypeVarTuple是编译时类型变量,运行时无法直接获取参数数量,因此需要在子类的__init__中显式初始化对应数量的空列表,确保类型和数量一致。

内容的提问来源于stack exchange,提问作者mutableVoid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:08:21