2010-12-13 8 views
4

Ich versuche, eine Klasseninstanz mit zwei Listen einer anderen Instanzen zu beizen. Die Instanzen in den zwei Listen haben Attribute, die Instanzen voneinander verweisen. Hier sind die Klassen.AttributeError: Edge-Instanz hat kein Attribut 'vto'

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) 

Wenn ich versuchte, einen einfachen Graphen zu säubern, gibt das unpickling einen Fehler aus.

>>> 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' 

fand ich, dass der Fehler verschwindet, wenn man die __hash__ Funktion der Edge-Klasse kommentiert werden. Ich brauche deine Hilfe, um zu verstehen, warum das passiert.

+1

Ist "Vertax" eine nicht US-Schreibweise von Vertex? – SingleNegationElimination

+0

Anstatt Hash zu tun (Tupel (map (hash, (self.vto, self.vfrom)))), würde ich 'hash ((self.vto, self.vfrom))' '' tuple .__ hash__ 'Hashes jedes Element darin, so dass die beiden tatsächlich gleichwertig sind. –

+0

TokenMacGuy // Oh, das ist mein Fehler. –

Antwort

3

Dieser Python Problem kann die Ursache sein: http://bugs.python.org/issue1761028

"Gurke - nicht unpickle Kreis deps mit benutzerdefinierten __hash__"

+0

Das möchte ich finden. Vielen Dank. :) –

Verwandte Themen