Что может работать лучше, так это инкапсулировать вашу древовидную структуру с помощью объекта Node, который может содержать значение и список дочерних элементов:
class Node(object):
def __init__(self, children=[], value=None):
self.children = children
self.value = value
def isLeaf(self):
return len(self.children) == 0
Теперь узел в явном виде является либо листом со значением, либо элементом с дочерними элементами (технически не листовые узлы также могут иметь значения в этом примере, но код вашего приложения может принять решение о том, что неконечные узлы никогда не имеют значений ). parseTree
можно записать как:
def parseTree(node):
if node.isLeaf():
treatLeafNode(node)
else:
for child in node.children:
parseTree(child)
Обратите внимание, что это поиск в дереве по глубине.
Могут быть более удачные способы обернуть это так, что parseTree
- это метод Node
, но это должно дать вам представление. Конечно, у вас все еще есть проблема с тем, что вы просите пользователя написать код Python, который представляет собой списки списков в качестве входных данных, и проанализировать его в приведенной выше древовидной структуре, вам нужно будет использовать isinstance
. Возможно, yaml был бы лучшим выбором языка описания, поскольку пользователи не могут затем вставить произвольный код Python в ваш ввод?