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

Python函数返回同输入类型序列的正确类型注解及错误修正

问题分析与解决

错误原因

原代码的类型注解存在两处关键问题:

  1. TypeVar未声明协变:Sequence本身是协变类型,但默认的TypeVar是不变类型,mypy无法推断data[:]返回的具体Sequence子类实例能匹配不变的S类型。
  2. 未关联元素类型:原TypeVar仅绑定到Sequence,未指定元素类型参数,导致mypy将切片结果推断为泛化的Sequence[Any],而非输入的具体S类型(比如list[int]或tuple[str]),因此触发类型不兼容报错。

正确的类型注解方式

要精准保证返回值与输入参数是同类型的Sequence子类,需要定义协变的TypeVar并关联Sequence的元素类型:

from typing import TypeVar, Sequence

T = TypeVar("T")
# 声明协变TypeVar,绑定到带元素类型的Sequence
S = TypeVar("S", bound=Sequence[T], covariant=True)

def chunk(data: S) -> S:
    return data[:]

补充说明

  • covariant=True:适配Sequence的协变特性,让mypy识别出切片返回的具体子类实例与输入类型S兼容。
  • 绑定Sequence[T]:明确关联元素类型T,避免mypy将切片结果推断为Sequence[Any],确保类型匹配的精准性。

如果不需要严格限制返回具体子类,仅需返回Sequence类型(允许不同子类),也可以简化为:

from typing import TypeVar, Sequence

T = TypeVar("T")

def chunk(data: Sequence[T]) -> Sequence[T]:
    return data[:]

但这种方式无法保证返回的是输入的具体子类(比如输入tuple[int]可能返回list[int],mypy不会报错)。

内容的提问来源于stack exchange,提问作者Jean-Paul Calderone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:24:18