支持回推的迭代器

kjo*_*kjo 3 python iterator

我正在寻找为什么将常规迭代器转换为支持将项目推回其中的迭代器。例如

item = next(my_iterator)
if went_too_far(item):
    my_iterator.pushback(item)
    break;
Run Code Online (Sandbox Code Playgroud)

这与支持peek;的迭代器类似,但不完全相同。对于后者,上面看起来更像这样:

if went_too_far(my_iterator.peek()):
    break
else:
    item = next(my_iterator)
Run Code Online (Sandbox Code Playgroud)

kjo*_*kjo 5

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)
Run Code Online (Sandbox Code Playgroud)

要使用它:

pushback_enabled_iterator = PushbackWrapper(original_iterator)

item = next(pushback_enabled_iterator)
if went_too_far(item):
    pushback_enabled_iterator.pushback(item)
    break;
Run Code Online (Sandbox Code Playgroud)