【发布时间】:2012-11-22 11:39:39
【问题描述】:
假设我们有这个递归函数(生成器)
data = [1,[21, 22, [231, 232, 233]], [31, 32, 33]]
def listgen(data):
for each in data:
if type(each) is int:
yield str(each)
elif type(each) is list:
g = listgen(each)
for i in g:
yield i
else:
continue
gen = listgen(data)
print ' '.join(gen)
输出是:
1 21 22 231 232 233 31 32 33
现在...我怎样才能把它写成一个类,因为我需要为那个生成器定义 .close() 方法?
【问题讨论】:
-
为什么要定义
.close()? -
这不是我期望的输出,为什么不是结果字符串?此外,您不应该使用
type(each) is int,使用isinstance(each, int)等...(很少需要检查确切的类型) -
这是一个简化的案例。最后在一个网络应用程序中,我将通过 WebOb.app_iter 从数据库中流式传输一些数据(递归生成),关闭会话(到数据库)的唯一方法是在我的生成器中的方法 .close() 中关闭它.
-
你不能把它放在
finally子句中吗?它应该在所有值用完或生成器超出范围时运行。 -
我认为您可以在基于函数的生成器中将
close调用作为GeneratorExit异常捕获。在 Python 3.3 中,如果您使用新的yield from语法,即使对于递归生成器也可以直接使用(否则您需要有自己的代码来传播调用)。
标签: python recursion generator