如何正确为分块可迭代对象的函数添加泛型类型标注,使返回值为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
相关产品推荐
相关产品推荐

