4 Stimmen

AttributFehler: Kanteninstanz hat kein Attribut 'vto'

Ich versuche, eine Klasseninstanz, die zwei Listen einer anderen Instanz enthält, zu beherbergen. Die Instanzen in den beiden Listen haben Attribute, die auf Instanzen der jeweils anderen Klasse verweisen. Hier sind die Klassen.

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)

Als ich versuchte, ein einfaches Diagramm zu entpicken, gab es eine Fehlermeldung beim Entpicken.

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

Ich habe festgestellt, dass der Fehler verschwindet, wenn man die __hash__ Funktion der Klasse Edge. Ich brauche Ihre Hilfe, um zu verstehen, warum dies geschieht.

3voto

Adam Vandenberg Punkte 18803

Dieses Python-Problem könnte die Ursache sein: http://bugs.python.org/issue1761028

"pickle" - kann zirkuläre Ablagerungen mit benutzerdefinierten Ablagerungen nicht entpicken __hash__ "

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X