0

我有一个简单的树结构,其中每个节点可以有几个通过键访问的子节点(+ 一些存储在中的有效负载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

问题源于我在树中使用Objas label(即作为 中的键dict)。(当使用例如字符串而不是Obj如果它们并非完全不同时,它也会失败。)

如何将其更改为按预期工作?

4

2 回答 2

1

当继承内置类型dict或使用新样式类时,您至少应该使用pickle 协议 2。python2 的默认值仍然是 0,这可能会有问题。

使用dump(t, open("test.dat", "wb"), protocol=2)您的代码时,可以cPicklepickle类似的代码一起使用。

并记住关于以二进制模式打开文件的注释

于 2013-05-17T16:11:45.333 回答
0

如果这仍然不起作用(请参阅 Aya 的评论),您是否可以选择使用另一个树结构?如果是这样,这是一个腌制 DOM 树结构的脚本。

于 2013-05-17T15:49:39.030 回答