2013-05-17 47 views
0

我有一個簡單的樹結構,其中每個節點可以具有它們通過鍵訪問幾個孩子(+存儲在value一些有效載荷):的Python:模糊度時(未)酸洗基於字典樹

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 
    B:None 
     B:None 
     D:None 
     C:None 
     E:None 
    E:None 

問題的事實,我在樹中使用Objlabel秒(即出現作爲dict中的鍵)。 (如果使用例如字符串而不是Obj,則它也失敗,如果它們不是全部相互不同的話)。

這怎麼可能改變成按預期工作?

+0

如果你使用pickle包而不是cpickle,你會得到同樣的行爲嗎? –

+0

你可以通過使TreeDict和Obj從對象繼承來讓你的課程成爲新的風格嗎?行爲是否改變? –

+0

'pickle'在保存時已經失敗(可能正確...) – fuenfundachtzig

回答

0

如果這仍然不起作用(請參閱Aya的評論),是否正在使用另一個樹形結構選項?如果是這樣,這是一個腳本to pickle DOM tree structure