【问题标题】:accessing **kwargs in anytree nodes在 anytree 节点中访问 **kwargs
【发布时间】:2019-03-09 21:31:26
【问题描述】:

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

问题是如何访问树中的“数量”和“单位”字段?

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)])

只是为了得到错误!

【问题讨论】:

  • 我怀疑您使用属性语法的列表理解失败,因为根节点没有您要查找的属性。由于您的树只有两个级别,因此可能迭代 Harburger.children 而不是进行遍历?
  • 你明白了 - 当我将 qty 和 uom 字段添加到最高记录时,效果很好。呜呜!添加你的答案,我会投票给你!

标签: python-3.x keyword-argument anytree


【解决方案1】:

您的代码访问额外属性的问题是顶级Node 没有qty 和uom 属性,所以当它首先出现在预排序树遍历中时,代码退出并出现异常。

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

另一种选择可能是在使用属性之前对其进行测试,例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多