AttributeError: Edge instance does not have 'vto' attribute

I am trying to sort an instance of a class containing two lists of other instances. Instances in two lists have attributes that refer to each other's instances. Here are the classes.

class Graph: def __init__(self): self.vertices = {} self.edges = set() def __repr__(self): return "\n".join(map(str, sorted(self.vertices, key=lambda v:v.id))) class Edge: def __init__(self, vfrom, vto): self.vfrom = vfrom self.vto = vto def __hash__(self): return hash(tuple(map(hash, (self.vto, self.vfrom)))) def __repr__(self): return str(self.vto.id) class Vertax: def __init__(self, id): self.id = id self.incoming = set() self.outgoing = set() def __repr__(self): return "Vertax %d -> %s"%(self.id, ", ".join(map(str, self.outgoing))) def __hash__(self): return hash(self.id) 

When I tried to lay out a simple schedule, scattering gives an error.

 >>> v0 = Vertax(0) >>> v1 = Vertax(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) >>> print g Vertax 0 -> 1 Vertax 1 -> >>> >>> import pickle >>> p = pickle.dumps(g) >>> pickle.loads(p) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/pickle.py", line 1374, in loads return Unpickler(file).load() File "/usr/lib/python2.6/pickle.py", line 858, in load dispatch[key](self) File "/usr/lib/python2.6/pickle.py", line 1133, in load_reduce value = func(*args) File "<stdin>", line 6, in __hash__ AttributeError: Edge instance has no attribute 'vto' 

I found that the error disappears if you notice the __hash__ function of the Edge class. I need your help to understand why this is happening.

+4
source share
1 answer

This Python problem could be causing: http://bugs.python.org/issue1761028

"pickle - cannot unpack circular prints with custom __hash__ "

+3
source

All Articles