你真的,真的,真的不想尝试使用 repr
和 eval
作为序列化格式。
如果您只是使用过,说, 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
. - 不要尝试添加有关事物的报价。如果对象本身没有引号,背面闪烁,看不见的字符等,那可能会奏效,但是为什么要依靠呢?如果您认为需要报价,这几乎总是一个符号,表明您违反了以前的规则,应该解决这个问题。
这是您可以为此类编写可返回的repter的方法:
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("'"))
. 。但是,任何这样的“修复”都将使您难以调试一旦遇到的一般问题,例如,一个名称不像单个all-ascii-letter单词那样简单。