2010-12-13 14 views
4

Ich versuche, eine Klasseninstanz mit zwei Listen einer anderen Instanzen zu picken. Die Instanzen in den zwei Listen haben Attribute, die Instanzen voneinander verweisen. Hier sind die Klassen.python pickle.dumps AssertionError

Ich bekam einen AssertionError, wenn ich einen einfachen Graphen wie folgt einlegte.

>>> v0 = Vertex(0) 
>>> v1 = Vertex(1) 
>>> e0to1 = Edge(v0, v1) 
>>> v0.add_outgoing(e0to1) 
>>> v1.add_incoming(e0to1) 
>>> g = Graph() 
>>> g.vertices[v0] = v0 
>>> g.vertices[v1] = v1 
>>> g.edges.add(e0to1) 
>>> g.edges.add(e0to1) 
>>> v2 = Vertex(2) 
>>> e0to2 = Edge(v0, v2) 
>>> v0.add_outgoing(e0to2) 
>>> v2.add_incoming(e0to2) 
>>> g.vertices[v2] = v2 
>>> g.edges.add(e0to2) 
>>> 
>>> print g 
Vertex 0 -> 2, 1 
Vertex 1 -> 
Vertex 2 -> 
>>> p = pickle.dumps(g) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/pickle.py", line 1366, in dumps 
    Pickler(file, protocol).dump(obj) 
    File "/usr/lib/python2.6/pickle.py", line 224, in dump 
    self.save(obj) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 725, in save_inst 
    save(stuff) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "/usr/lib/python2.6/pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "/usr/lib/python2.6/pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "/usr/lib/python2.6/pickle.py", line 401, in save_reduce 
    save(args) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 562, in save_tuple 
    save(element) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 600, in save_list 
    self._batch_appends(iter(obj)) 
    File "/usr/lib/python2.6/pickle.py", line 615, in _batch_appends 
    save(x) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 725, in save_inst 
    save(stuff) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "/usr/lib/python2.6/pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 725, in save_inst 
    save(stuff) 
    File "/usr/lib/python2.6/pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "/usr/lib/python2.6/pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "/usr/lib/python2.6/pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "/usr/lib/python2.6/pickle.py", line 331, in save 
    self.save_reduce(obj=obj, *rv) 
    File "/usr/lib/python2.6/pickle.py", line 405, in save_reduce 
    self.memoize(obj) 
    File "/usr/lib/python2.6/pickle.py", line 244, in memoize 
    assert id(obj) not in self.memo 
AssertionError 

Ich arbeitete, wenn die v2 entfernt wird.

>>> v0 = Vertex(0) 
>>> v1 = Vertex(1) 
>>> e0to1 = Edge(v0, v1) 
>>> v0.outgoing.add(e0to1) 
>>> v1.incoming.add(e0to1) 
>>> g = Graph() 
>>> g.vertices[v0] = v0 
>>> g.vertices[v1] = v1 
>>> g.edges.add(e0to1) 
>>> g.edges.add(e0to1) 
>>> import cPickle as pickle 
>>> p = pickle.dumps(g) 
>>> print pickle.loads(p) 
Vertex 0 -> 1 
Vertex 1 -> 

Haben Sie eine Idee?

Antwort

0

Es gibt einige Arten von Daten, die das ältere Pickle-Protokoll nicht verarbeiten kann. Um Ihr Problem zu lösen, verwenden Sie pickle.HIGHEST_PROTOCOL

>>> p = pickle.dumps(g) 
    File "/usr/lib/python2.6/pickle.py", line 244, in memoize 
    assert id(obj) not in self.memo 
AssertionError: 
>>> p = pickle.dumps(g, pickle.HIGHEST_PROTOCOL) 
>>> # No problem!