原则上,为迭代器编写一个包装器是很容易的,它允许任意前瞻,并且有一些问题专门用于此(例如Using lookahead with generators)。
但是,鉴于几乎所有非平凡的文件解析都会从这样的设施中获益,对标准库来说似乎太明显了;是否真的没有内置或标准库机制,这将允许偷看?
具体来说,我通常需要窥视函数调用:子函数应该能够检查任意数量的即将到来的元素,而不是从迭代器中删除它们 - 本质上是一个队列数据类型,其中元素是从迭代器中懒惰地获取的。
在某些情况下,collections.deque
或itertools.tee
可用于构建变通方法。但是为了代码可读性,它们是不利的。
没有。
我经常发现自己使用pairwise
Recipe前瞻...
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
for item, peek in pairwise(iterable):
...
或者简单地将您的iterable转换为Sequence(如果它还没有)并使用索引查找。
for index, item in enumerate(sequence):
try:
peek = sequence[index+1]
except IndexError:
peek = None