我有一个简单的树结构,其中每个节点可以有几个通过键访问的子节点(+ 一些存储在中的有效负载value
):
class NodeDict(dict):
def __init__(self, parent):
self.parent = parent
self.value = None
def AddChild(self, label):
self[label] = NodeDict(self)
return self[label]
class TreeDict:
def __init__(self):
self.root = NodeDict(None)
def ToString(self, level, node):
res = ":" + str(node.value) + "\n"
for k, v in node.items():
res += " "*level + str(k) + self.ToString(level + 1, v)
return res
def __str__(self):
return self.ToString(1, self.root)
当我尝试腌制这样一棵树时,我遇到的问题是它没有正确解开,如下例所示:
class Obj:
def __init__(self, v):
self.v = v
def __str__(self):
return str(self.v)
t = TreeDict()
a = t.root.AddChild(Obj("A"))
b = a.AddChild(Obj("B"))
c = b.AddChild(Obj("C"))
d = b.AddChild(Obj("D"))
e = a.AddChild(Obj("E"))
print t
import cPickle
cPickle.dump(t, open("test.dat", "w"))
t = cPickle.load(open("test.dat", "r"))
print t
这棵树以前是这样的
:None
A:None
E:None
B:None
C:None
D:None
在酸洗和解酸之后像这样:
:None
A:None
B:None
B:None
D:None
C:None
E:None
E:None
问题源于我在树中使用Obj
as label
(即作为 中的键dict
)。(当使用例如字符串而不是Obj
如果它们并非完全不同时,它也会失败。)
如何将其更改为按预期工作?