访问任何树节点中的**kwargs

accessing **kwargs in anytree nodes

我是 Python/AnyTree 的新手,我正在尝试获取一份原料清单来制作一堆汉堡包(位于旧金山附近 Point San Pablo Harbor 的汉堡包 - 如果您需要检查一下你在这个地区!!事实上,下次你在城里时,这里的获胜答案会给我一个免费的 Harburger!)但我离题了......

问题是我如何才能访问树中的 'qty' 和 'uom' 字段?

from anytree import Node, RenderTree, PreOrderIter
Harburger=Node("Harburger", children=[
        Node("RoundRoll", qty=1, uom='ea'),
        Node("GriddleGhee", qty = 1, uom='gm'),
        Node("SmashedBurger", qty = 5, uom='oz')])

print(RenderTree(Harburger))

Node('/Harburger')
├── Node('/Harburger/RoundRoll', qty=1, uom='ea')
├── Node('/Harburger/GriddleGhee', qty=1, uom='gm')
└── Node('/Harburger/SmashedBurger', qty=5, uom='oz')

到目前为止,还不错。 现在我可以遍历树了,比如:

#print ingredients for 5 Harburgers
print([(node.name for node in PreOrderIter(Harburger)])

['Harburger', 'RoundRoll', 'GriddleGhee', 'SmashedBurger']

如何修改此命令以获取数量和数量?

我试过了

print([(node.name, node.qty) for node in PreOrderIter(Harburger)])

只会得到错误!

您的代码访问额外属性的问题是顶级 Node 没有 qtyuom 属性,所以当它首先出现在前序树遍历,代码异常退出

您可以通过几种方式解决此问题。您评论过的一种方法是将属性也添加到根节点。

另一种选择可能是在使用属性之前测试它们,例如:

print([(node.name, node.qty) for node in PreOrderIter(Harburger) if hasattr(node, "qty")])

如果您可以依靠只有两层(顶级根节点及其子节点)的树,则可以只迭代子节点而不是进行完整遍历。只需使用 Harburger.children 而不是 PreOrderIter(Harburger).