2016-02-27 133 views
1

我正在尋找一個爲什麼將一個常規迭代器轉換成一個支持將項目推回到其中的支持。例如。迭代器,支持後推

item = next(my_iterator) 
if went_too_far(item): 
    my_iterator.pushback(item) 
    break; 

這是類似的,但不完全相同的,支持peek一個迭代;後者,上面會顯示如下信息:

if went_too_far(my_iterator.peek()): 
    break 
else: 
    item = next(my_iterator) 

回答

1
class PushbackWrapper(object): 

    def __init__(self, iterator): 
     self.__dict__['_iterator'] = iterator 
     self.__dict__['_pushed'] = [] 

    def next(self): 
     if len(self._pushed): 
      return self._pushed.pop() 
     else: 
      return self._iterator.next() 

    def pushback(self, item): 
     self._pushed.append(item) 

    def __getattr__(self, attr): 
     return getattr(self._iterator, attr) 

    def __setattr__(self, attr, value): 
     return setattr(self._iterator, attr, value) 

要使用它:

pushback_enabled_iterator = PushbackWrapper(original_iterator) 

item = next(pushback_enabled_iterator) 
if went_too_far(item): 
    pushback_enabled_iterator.pushback(item) 
    break;