访问任意节点中的** kwargs

问题描述 投票:0回答:1

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

问题是我如何才能访问树中的'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']

如何修改此命令以获取qty和uom?

我试过了

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

只是为了得到错误!

python-3.x kwargs anytree
1个回答
0
投票

您的代码访问额外属性的问题是顶级Node没有qtyuom属性,因此当它在预订树遍历中首先出现时,代码退出时会出现异常。

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

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

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

如果您可以依赖仅具有两个级别(顶级根节点及其子节点)的树,则可以仅迭代子节点而不是执行完全遍历。只需使用Harburger.children而不是PreOrderIter(Harburger)

© www.soinside.com 2019 - 2024. All rights reserved.