StopIteration异常会自动向上传播吗?
我正在用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
这个关键词——它能大大简化生成器和迭代器的创建。