Если вы просто использовали, скажем, pickle
, у вас не будет этой проблемы вообще:
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)
Намного проще, да?
Но если вы хотите знать, как решить непосредственную проблему вместо того, чтобы сделать ее неактуальной: у вас есть несколько проблем в вашем __repr__
Метод, все это должно быть исправлено, если вы хотите, чтобы он был за круглым.
- Вы генерируете представление строки ... и затем звоните
repr
в теме. Вы хотите вернуть представление строки, а не представление строки из строковое представление. Просто оставьтеrepr
. - Вы всегда должны делегировать в
repr
субъектов, а неstr
. Анкет Если вы используете%
-Фортинг, это означает использование%r
скорее, чем%s
. - Не пытайтесь добавить цитаты вокруг вещей. Это может случиться с работы, если у самого объекта нет цитат, бэк -хлеб, невидимых символов и т. Д., Но зачем полагаться на это? Если вы думаете, что вам нужны цитаты, это всегда всегда признак того, что вы нарушали предыдущее правило, и вместо этого вы должны исправить это.
Вот как вы можете написать для этого класса репресс-репрессию:
def __repr__(self):
return 'Task(%r, %r)' % (self.name, self.timespent))
И вы можете убедиться, что он делает то, что вы хотите:
>>> t = Task('task name', 23.4)
>>> t
Task('task name', 23.4)
>>> eval(repr(t))
Task('task name', 23.4)
Конечно, в вашем конкретном примере просто исправление первой проблемы (удаление ложного вызова repr
) избавился бы от единых цитат и сделал этот конкретный пример работы. Вы также можете взломать это на стороне чтения, позвонив eval
дважды. Или, для этого конкретного примера, даже позвонив eval(s[1:-1])
или же eval(s.strip("'"))
. Анкет Но любое «исправление», подобное этому, просто заставит отлаживать общие проблемы, с которыми вы столкнетесь, когда у вас есть, например, имя, которое не так просто, как одно из Asci-letter.