【发布时间】:2016-02-02 14:22:24
【问题描述】:
Python 生成器是一个很棒的功能。它允许我对复杂的、可能是递归的遍历逻辑进行编码,并将其与用户分离。通常我像下面这段代码一样使用它
TREE = {
1: [2,3],
2: [],
3: [4,5],
4: [6],
5: [],
6: []
}
def query_children(node):
return TREE[node]
def walk_tree(root):
# recursive tree traversal logic
yield root
children = query_children(root)
for child in children:
for node in walk_tree(child):
yield node
def do_something():
# nice linear iterator
for node in walk_tree(root):
print(node)
Tornado 使用生成器实现协程,这也是构建没有回调的异步函数的好方法。
但是,当我尝试同时使用这两种方法时,我可能会感到困惑。
@gen.coroutine
def query_children(node):
...
raise gen.Return(children)
def walk_tree(root):
# recursive tree traversal logic
yield root
children = yield query_children(root)
for child in children:
for node in walk_tree(child):
yield node
def do_something():
# nice linear iterator
for node in walk_tree(root):
print(node)
在新的 walk_tree 中,第一个收益是常规 Python 收益。第二个收益是 Tornado 的。他们可以一起工作吗?
【问题讨论】:
-
我想知道你有没有忘记在第 5 行使用生成器
walk_tree(child)?您只创建生成器对象但不使用它。您必须再添加一个循环:for node in walk_tree(child): yield node -
已编辑以使代码可运行。
标签: python generator tornado coroutine