2016-02-27 75 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;