python-3.x - 访问任意树节点中的 **kwargs

标签 python-3.x keyword-argument anytree

我是 Python/AnyTree 的新手,正在尝试获取制作一堆汉堡包的原 Material 列表(汉堡包位于旧金山附近的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)])

只是为了得到错误!

最佳答案

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

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

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

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

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

关于python-3.x - 访问任意树节点中的 **kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55082161/

相关文章:

python - 如何替换 4 维数组中的值?

python - 使用 super() 继承关键字参数,但只有在创建实例时指定时才会列出它们

python - 在 Python 中使用 **kwargs 的正确方法

python - 使用anytree将JSON转换为图像

python - 在 Python 中渲染一棵树

python - 如何使用 python anytree 获取所有可能的分支

python - 在numpy中用3d数组索引2d数组

python-3.x - 有没有办法指示 Pylint 哪些库应该被视为第 3 方?

python-3.x - 在 pandas 的 for 循环中读取时如何连接交叉表

c++ - 在 C++ 中的关键字参数的聚合初始化中使用指定的初始值设定项是否可以?