Я создаю дерево с библиотекой anytree. Я хочу иметь возможность изменить его, затем экспортировать - сохранить на диск и импортировать обратно с изменениями. Например, пример дерева:
udo = Node("Udo")
marc = Node("Marc", parent=udo)
lian = Node("Lian", parent=marc)
dan = Node("Dan", parent=udo)
jet = Node("Jet", parent=dan)
jan = Node("Jan", parent=dan)
joe = Node("Joe", parent=dan)
Udo
├── Marc
│ └── Lian
└── Dan
├── Jet
├── Jan
└── Joe
Я могу изменить его, например, отрезать Дэна и добавить детей к Марку.
dan.parent = None
bonny = Node ("Bonny", parent = marc)
Udo
└── Marc
├── Lian
└── Bonny
Но когда я экспортирую дерево в json, а затем импортирую его обратно, кажется, что единственный узел, на который я могу сослаться, — это корень. Так что я больше не могу делать такого рода модификации, потому что имена переменных, такие как dan
или marc
, отсутствуют, т. е. я не нахожу способа сослаться на узел. Я что-то упустил?
with open ('cajon/anytreeexample.json', 'r+', encoding = 'utf-8') as f:
datos = importer.read(f)
print (datos)
Это означает, что после импорта дерева у вас есть просто корневой узел.
AnyNode(name='Udo') # Udo is the root
Отсюда вы можете получить детей Удо, а дети детей, как
marc, dan = udo.children
lian = marc.children
jet, jan, joe = dan.children
Но они не работают как узел
print (lian.parent)
AttributeError: 'tuple' object has no attribute 'parent'
И, кажется, вы не можете прикрепить к ним детей, что является моей основной целью с этой структурой:
sonny = AnyNode("Sonny", parent = lian)
TypeError: __init__() got multiple values for argument 'parent'
Итак, мой вопрос: есть ли способ загрузить сохраненное json-дерево в правильную структуру anytree, куда вы можете добавлять новые узлы?
variable = value
, другого пути нет. Также кажется, что некоторые из них не работают, поскольку узел.children
возвращает кортеж, а не узел. И, похоже, я тоже не знаю, как добавлять детей Как насчетsonny = Node("Sonny", parent = dan)
? - person Stop harming Monica   schedule 18.08.2018.children
всегда возвращают кортеж узлов, экспорт тут ни при чем. Чтобы добавитьnewnode
кnodeX
, предполагая, что иnewnode
, иnodeX
являются узлами, вы просто делаетеnewnode.parent = nodeX
. - person Stop harming Monica   schedule 18.08.2018,
- person Fabian N.   schedule 18.08.2018