我正在在.dat文件中存储对类任务的调用。我想阅读此文件并重建类调用。

这是我现在正在使用的课程:

class Task:

    def __init__(self, name, timespent):
        self.name = name
        self.timespent = timespent

    def __repr__(self):
        return repr('Task("%s",%s)'%(self.name, self.timespent))

这是文件中的读数:

task_list = []
with open("task_list2.dat", "r") as file:
    task_list = eval(file.readline())

这是文件的写作:

with open("task_list2.dat", "w") as outFile:
    print(repr(task_list), file = outFile)

这是文件的内容:['Task("class",20)']其中“类”是任务的名称。

我知道问题与围绕“任务”(“ class”,20)'的单个引号有关,但我不知道如何摆脱它们。我收到的错误消息沿着:“ str对象没有属性'名称'”的行为。

如何删除这些引号,以便我下次阅读文件时可以重建类?

有帮助吗?

解决方案

你真的,真的,真的不想尝试使用 repreval 作为序列化格式。

如果您只是使用过,说, 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单词那样简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top