不。我会制作一个适配器,主要转发所有呼叫,但在您这样做时保留最后一行的副本,next
然后让您调用不同的方法以使该行再次弹出。
我实际上会让适配器成为一个可以包装任何可迭代而不是文件包装器的适配器,因为这听起来在其他上下文中经常有用。
Alex 关于使用itertools.tee
适配器的建议也有效,但我认为编写自己的迭代器适配器来处理这种情况通常会更干净。
这是一个例子:
class rewindable_iterator(object):
not_started = object()
def __init__(self, iterator):
self._iter = iter(iterator)
self._use_save = False
self._save = self.not_started
def __iter__(self):
return self
def next(self):
if self._use_save:
self._use_save = False
else:
self._save = self._iter.next()
return self._save
def backup(self):
if self._use_save:
raise RuntimeError("Tried to backup more than one step.")
elif self._save is self.not_started:
raise RuntimeError("Can't backup past the beginning.")
self._use_save = True
fiter = rewindable_iterator(file('file.txt', 'r'))
for line in fiter:
result = process_line(line)
if result is DoOver:
fiter.backup()
这不会太难扩展到允许您备份多个值的东西。