Как удалить кавычки из инициализатора класса при чтении из файла. Питон

StackOverflow https://stackoverflow.com/questions/19825504

Вопрос

Я храню звонок в классную задачу в массиве в файле .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)']Где «класс» - это имя задачи.

Я понимаю, что проблема связана с единственными цитатами, касающимися «задачи» («класс», 20) », но я понятия не имею, как избавиться от них. Сообщение об ошибке, которое я получаю, говорит что -то вроде: «У объекта STR нет атрибута« Имя »»

Как я могу удалить эти цитаты, чтобы я мог реконструировать классы в следующий раз, когда я прочитал файл?

Это было полезно?

Решение

Вы действительно, действительно, действительно не хотите использовать 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.
  • Не пытайтесь добавить цитаты вокруг вещей. Это может случиться с работы, если у самого объекта нет цитат, бэк -хлеб, невидимых символов и т. Д., Но зачем полагаться на это? Если вы думаете, что вам нужны цитаты, это всегда всегда признак того, что вы нарушали предыдущее правило, и вместо этого вы должны исправить это.

Вот как вы можете написать для этого класса репресс-репрессию:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top