繁体   English   中英

访问Anytree节点中的** kwargs

[英]accessing **kwargs in anytree nodes

我是Python / AnyTree的新手,正在尝试获取制作汉堡包的原料清单(汉堡附近的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']

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

我试过了

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM