星期四, 五月 22, 2008

Python 从生成器 "return" 而不是 "StopIteration"

在 ulfs/caxes 项目中的 tree.py 的 __revision__ = 268 版本中,我打算将 __traverse__() 方法做改进,以前返回一个 treedict,所以需要使用 tuple 作为其 pathseq,但现在打算完全取消 treedict,这样用 list 作为 pathseq 要合理得多,此时 __traverse__() 应该作为 generator 不断 yield 数据。

一开始编码如下:
 def __traverse__(self)
"""...
Comments
...
"""
id_self = id(self)
if self.__id_visited.has_key(id_self): return {}
# To avoid cyclic link problem!
Tree.__id_visited[id_self] = None
pathseq = self.__path_stack
yield pathseq, self
...
然后我在 Python 中尝试导入 tree 模块:
>>> import tree
Traceback (most recent call last):
File "", line 1, in
File "tree.py", line 399
yield pathseq, self
SyntaxError: 'return' with argument inside generator
这个错误实际上就是由于上面使用了 return,对 iterator/generator 来说,必须使用 StopIteration 异常处理来终止!
 def __traverse__(self):
id_self = id(self)
if self.__id_visited.has_key(id_self):
# return {}
raise StopIteration
# To avoid cyclic link problem!
Tree.__id_visited[id_self] = None
pathseq = self.__path_stack
yield pathseq, self
......

没有评论: