доступ к ** kwargs в узлах anytree - PullRequest
0 голосов
/ 10 марта 2019

Я новичок в Python / AnyTree и пытаюсь получить список сырых ингредиентов, чтобы собрать кучу харбургеров (Гамбургеры в Point San Pablo Harbour возле Сан-Франциско - вам нужно проверить это если вы находитесь в районе !! На самом деле, победивший ответ дает мне бесплатный Харбургер в следующий раз, когда вы в городе!) Но я отвлекся ...

Вопрос в том, как мне получить доступ к полям '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)])

только для получения ошибок!

1 Ответ

0 голосов
/ 10 марта 2019

Проблема, с которой ваш код обращается к дополнительным атрибутам, состоит в том, что верхний уровень Node не имеет атрибутов qty и uom, поэтому, когда он появляется первым в обходе дерева предзаказа,Код завершается с исключением.

Это можно исправить несколькими способами.Один из способов, который вы прокомментировали, сработал, это также добавить атрибуты к корневому узлу.

Другой вариант может заключаться в проверке атрибутов перед их использованием, например:

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

Если вы можете полагаться на свое дерево, имеющее только два уровня (корневой узел верхнего уровня и его дочерние элементы), вы можете выполнять итерацию только по дочерним узлам вместо полного обхода.Просто используйте Harburger.children вместо PreOrderIter(Harburger).

...