我有一个简单的树类,我需要能够遍历叶子节点。
我将数据添加到我的树中,如下所示:
p = ParamTree()
p.add('system.screen.timeout')
p.add('system.screen.lock.enabled')
p.add('system.screen.lock.code')
我希望能够依次获得timeout
,enabled
和code
。
如果我编写一个函数来打印值,它会按预期工作:
def print_nodes(tree):
for node in tree.nodes:
if node.has_children():
print_nodes(node)
else:
print(node)
输出:
>>> print_nodes(p)
timeout
enabled
code
我如何实现同样的生成器呢?我尝试将print()
替换为yield
,但它无效。
def yield_nodes(tree):
for node in tree.nodes:
if node.has_children():
yield_nodes(node)
else:
yield node
输出:
>>> g = yield_nodes(p)
>>> for n in g:
... print(n)
...
>>>
答案 0 :(得分:2)
我将假设您的yield_nodes
生成器编写如下:
def yield_nodes(tree):
for node in tree.nodes:
if node.has_children():
yield_nodes(node)
else:
yield node
正如您可能注意到的那样,调用yield_nodes
会返回一个生成器(您可以迭代),但实际上并没有对它进行任何操作。我建议的解决方案如下:
def yield_nodes(tree):
for node in tree.nodes:
if node.has_children():
yield from yield_nodes(node)
else:
yield node