あなたは本当に、本当に、本当に使いたくない 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
. - 物事の周りに引用を追加しようとしないでください。オブジェクト自体に引用符、バックスラッシュ、目に見えないキャラクターなどがない場合、それはたまたま機能しますが、なぜそれに依存しているのですか?引用符が必要だと思われる場合は、それは常に前のルールを破ったことの兆候であり、代わりにそれを修正する必要があります。
このクラスのラウンドトリップ可能なREPRを書く方法は次のとおりです。
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
2回。または、この特定の例については、呼び出しても eval(s[1:-1])
また eval(s.strip("'"))
. 。しかし、そのような「修正」は、たとえば、単一のASSII-letterの単語ほど単純ではない名前を持っていると、あなたが遭遇する一般的な問題をデバッグすることを難しくするだけです。