StopIteration异常会自动向上传播吗?

1 投票
3 回答
596 浏览
提问于 2025-04-16 12:03

我正在用Python实现一个迭代器,这个迭代器会包装另一个迭代器,并在把输出传递给下一个地方之前对其进行后处理。这里有一个简单的例子,它接收一个返回字符串的迭代器,并在每个字符串前面加上FILTERED BY MYITER:

class MyIter(object):
    """A filter for an iterator that returns strings."""
    def __init__(self, string_iterator):
        self.inner_iterator = string_iterator
    def __iter__(self):
        return self
    def next(self):
        return "FILTERED BY MYITER: " + self.inner_iterator.next()

当内部的迭代器完成时,它会抛出一个叫做StopIteration的异常。我需要做些什么特别的事情来把这个异常传递给使用my迭代器的代码吗?还是说这会自动发生,从而正确结束我的迭代器。

3 个回答

1

在这种情况下,StopIteration 这个异常会被传递出去。

1

你试过之后发生了什么呢?:-)

没错,StopIteration这个异常并不特别,它会一直传递下去,直到有地方处理它。next()这个方法不会处理这个异常,而self.inner_iterator.next()在没有东西可以继续遍历的时候会抛出一个StopIteration的错误。

1

你不需要做什么特别的事情——StopIteration这个异常会自动传播。

另外,你可能想了解一下yield这个关键词——它能大大简化生成器和迭代器的创建。

撰写回答