Wenn Sie nur benutzt haben, sagen wir, pickle
, Sie hätten dieses Problem überhaupt nicht:
with open("task_list2.dat", "wb") as outFile:
pickle.dump(task_list, outFile)
with open("task_list2.dat", "rb") as file:
task_list = pickle.load(file)
Viel einfacher, ja?
Aber wenn Sie wissen möchten, wie Sie das unmittelbare Problem lösen können, anstatt es irrelevant zu machen: Sie haben mehrere Probleme in Ihrem __repr__
Methode, die alle repariert werden müssen, wenn Sie möchten, dass sie rundum gerührt werden.
- Sie generieren eine String -Darstellung… und rufen dann an
repr
darauf. Sie möchten die String -Darstellung zurückgeben, nicht eine String -Darstellung von die String -Darstellung. Lass einfach das wegrepr
. - Sie sollten immer an die delegieren
repr
von Unterobjekten, nicht derstr
. Wenn Sie verwenden%
-Formatieren bedeutet die Verwendung%r
statt%s
. - Versuchen Sie nicht, Zitate um Dinge hinzufügen. Das mag passieren, wenn das Objekt selbst keine Zitate, Backslashes, unsichtbare Zeichen usw. enthält, aber warum jedoch darauf angewiesen ist? Wenn Sie der Meinung sind, dass Sie Zitate benötigen, ist es so ziemlich immer ein Zeichen dafür, dass Sie die vorherige Regel gebrochen haben, und Sie sollten das stattdessen beheben.
So können Sie für diese Klasse eine rundumstreckbare Repr schreiben:
def __repr__(self):
return 'Task(%r, %r)' % (self.name, self.timespent))
Und Sie können überprüfen, ob es das tut, was Sie wollen:
>>> t = Task('task name', 23.4)
>>> t
Task('task name', 23.4)
>>> eval(repr(t))
Task('task name', 23.4)
Natürlich in Ihrem speziellen Beispiel nur das erste Problem behoben (Entfernen des falschen Anrufs an repr
) hätte die einzelnen Zitate losgeworden und dieses bestimmte Beispiel zum Laufen gebracht. Sie können das auch auf der Leseseite durchrufen, indem Sie anrufen eval
zweimal. Oder für dieses spezielle Beispiel auch durch Anrufe eval(s[1:-1])
oder eval(s.strip("'"))
. Aber jeder "Fix" wie diese wird es nur schwerer machen, die allgemeinen Probleme zu debuggen, auf die Sie begegnen werden, z. B. einen Namen, der nicht so einfach ist wie ein einzelnes All-Ascii-Letter-Wort.