class pushback_wrapper(object): """ >>> p = pushback_wrapper(iter([1, 2, 3, 37])) >>> L = [] >>> for x in p: ... L.append(x) ... if x == 2: ... p.pushback(17) ... p.pushback(19) >>> L [1, 2, 19, 17, 3, 37] >>> bool(p) False >>> p.pushback(17) >>> bool(p) True >>> p.next() 17 >>> bool(p) False >>> p = pushback_wrapper(iter([1, 2])) >>> bool(p) True >>> p.next() 1 >>> p.next() 2 >>> bool(p) False >>> p.next() Traceback (most recent call last): ... StopIteration >>> bool(p) False >>> p.pushback(17) >>> bool(p) True """ def __init__(self, it): self.it = it self.pushed_back = [] def __iter__(self): return self def __nonzero__(self): if self.pushed_back: return True try: self.pushed_back.insert(0, self.it.next()) except StopIteration: return False else: return True def next(self): try: return self.pushed_back.pop() except IndexError: return self.it.next() def pushback(self, item): self.pushed_back.append(item)