Вы правы, используемая вами древовидная структура не очень питонна.Но вы можете легко превратить его в более питоническое решение, используя самодельные генераторы .
Например, для обхода родителей (или предков) вы можете определить функцию iter_parents
, например:это:
def iter_parents(node):
while node is not None:
yield node
node = node.get_parent()
С этим в руке, вы можете построить панировочные сухари, как это:
breadcrumbs = [node.get_text() for node in iter_parents(branch)]
Вот небольшая демонстрация:
class Node(object):
def __init__(self, text, parent=None):
self._text = text
self._parent = parent
def get_text(self):
return self._text
def get_parent(self):
return self._parent
branch = Node("c", Node("b", Node("a")))
breadcrumbs = [node.get_text() for node in iter_parents(branch)]
print(breadcrumbs)
# -> ['c', 'b', 'a']
Для node.next()
Вы можете определить генератор iter_next()
таким же образом.
edit
Используйте reverse
, чтобы перевернуть список, например:
breadcrumbs = [node.get_text() for node in iter_parents(branch)]
breadcrumbs.reverse()
print(breadcrumbs)
# -> ['a', 'b', 'c']