如何为接收可迭代对象的分块函数(chunker)添加类型注解?
解决方案
你需要用 Iterable[T] 替代 Iterator[T] 作为参数的类型注解,因为所有支持for i in seq遍历的对象都属于可迭代类型(Iterable),而Iterator只是Iterable的一个子集(带__next__方法的迭代器)。
修改后的代码如下:
from typing import Iterator, List, Iterable, TypeVar T = TypeVar('T') def chunker(seq: Iterable[T], size: int) -> Iterator[List[T]]: chunk = [] for item in seq: chunk.append(item) if len(chunk) == size: yield chunk chunk = [] if chunk: yield chunk for i in chunker([1, 2, 3, 4], 5): print(i) # 输出: [1,2,3,4]
关键说明
Iterable[T]是Python类型系统中专门用来表示可被遍历的对象的协议,包含了列表、元组、生成器、集合等所有能用于for循环的类型,比Union[Iterator[T], List[T]]更通用且优雅。- 当你在
for循环中使用Iterable对象时,Python会自动调用iter()方法将其转换为Iterator,所以函数内部的遍历逻辑完全不受影响。 - 原代码中
Iterator[T]的注解过于严格,因为像列表这类常见的可迭代对象本身并不是迭代器(没有实现__next__方法),只有调用iter(list)后才会得到迭代器。
内容的提问来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

