Você realmente, realmente, realmente não quer tentar usar repr
e eval
como formato de serialização.
Se você acabou de usar, digamos, pickle
, você não teria esse problema:
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)
Muito mais simples, sim?
Mas se você quiser saber como resolver o problema imediato em vez de torná -lo irrelevante: você tem vários problemas em seu __repr__
Método, todos os quais precisam ser corrigidos se você quiser que ele seja redondo.
- Você gera uma representação de string… e depois ligue
repr
nele. Você quer devolver a representação da string, não uma representação de string do a representação da string. Apenas deixe de fora orepr
. - Você deve sempre delegar ao
repr
de subobjetos, não ostr
. Se você está usando%
-Formatting, isso significa usar%r
ao invés de%s
. - Não tente adicionar cotações sobre as coisas. Isso pode funcionar se o objeto em si não tem cotações, barras de barriga, personagens invisíveis etc., mas por que confiar nisso? Se você acha que precisa de cotações, é sempre um sinal de que você quebrou a regra anterior e você deve consertar isso.
Veja como você pode escrever uma REP redonda para esta aula:
def __repr__(self):
return 'Task(%r, %r)' % (self.name, self.timespent))
E você pode verificar se faz o que deseja:
>>> t = Task('task name', 23.4)
>>> t
Task('task name', 23.4)
>>> eval(repr(t))
Task('task name', 23.4)
É claro que em seu exemplo específico, apenas corrigindo o primeiro problema (removendo a chamada espúria para repr
) teria se livrado das citações únicas e feito esse exemplo em particular funcionar. Você também pode invadir isso do lado da leitura ligando eval
duas vezes. Ou, para este exemplo em particular, mesmo ligando eval(s[1:-1])
ou eval(s.strip("'"))
. Mas qualquer "correção" como isso apenas dificultará a depuração dos problemas gerais que você encontrará quando tiver, por exemplo, um nome que não seja tão simples quanto uma única palavra-letra All-ASCII.