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

如何正确为分块可迭代对象的函数添加泛型类型标注,使返回值为list[int]

如何正确为分块可迭代对象的函数添加泛型类型标注,使返回值为list[int]

我来帮你解决这个类型标注的问题~你遇到的错误是因为TypeVar的约束不能直接使用带泛型参数的类型(比如Sequence[T]),得换一种正确的泛型声明方式。

你的核心需求应该是:当输入是list[int]时,分块函数返回的每个块也保持list[int]类型,对吧?我们可以通过正确定义泛型变量来实现这一点,同时解决Pylance的报错。

正确的实现代码

from typing import Generator, Sequence, TypeVar

# 定义元素类型的泛型变量,代表序列中单个元素的类型
T = TypeVar('T')
# 定义序列类型的泛型变量,绑定到Sequence[T],确保输入和输出的序列类型一致
S = TypeVar('S', bound=Sequence[T])

def chunk(sequence: S, size: int) -> Generator[S, None, None]:
    for i in range(0, len(sequence), size):
        yield sequence[i : i + size]

foo: list[int] = [1,2,3]
# 现在bar的类型是 Generator[list[int], None, None],每个生成的块都是list[int]
bar = chunk(foo, 1)
# 如果需要把生成器转换成列表,类型会是 list[list[int]]
bar_list = list(bar)

为什么这样写能解决问题?

  • 我们拆分了泛型变量的定义:T负责表示序列元素的类型,S负责表示序列本身的类型,通过bound=Sequence[T]限制S必须是Sequence的子类(比如list、tuple),且元素类型匹配T。
  • 返回类型Generator[S, None, None]明确告诉类型检查器:这个生成器会产出和输入序列同类型的块,不会接收外部值,也没有最终返回值。这样当你传入list[int]时,生成器产出的每个块自然就是list[int]类型了。

简化版(不需要严格保留序列类型)

如果你的场景不需要严格区分list和tuple等具体序列类型,只需要保证块的元素类型正确,也可以用更简洁的写法:

from typing import Generator, Sequence, TypeVar

T = TypeVar('T')

def chunk(sequence: Sequence[T], size: int) -> Generator[Sequence[T], None, None]:
    for i in range(0, len(sequence), size):
        yield sequence[i : i + size]

foo: list[int] = [1,2,3]
# 此时bar的类型是 Generator[Sequence[int], None, None],兼容所有元素为int的序列类型
bar = chunk(foo, 1)

备注:内容来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 19:14:30