ファイルから読み取るときに、クラスの初期化の見積もりを削除するにはどうすればよいですか。 Python

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オブジェクトには属性「名前」がありません」という線に沿って何かが表示されます。

次にファイルを読むときにクラスを再構築できるように、それらの引用を削除するにはどうすればよいですか?

役に立ちましたか?

解決

あなたは本当に、本当に、本当に使いたくない 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.
  • 物事の周りに引用を追加しようとしないでください。オブジェクト自体に引用符、バックスラッシュ、目に見えないキャラクターなどがない場合、それはたまたま機能しますが、なぜそれに依存しているのですか?引用符が必要だと思われる場合は、それは常に前のルールを破ったことの兆候であり、代わりにそれを修正する必要があります。

このクラスのラウンドトリップ可能な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の単語ほど単純ではない名前を持っていると、あなたが遭遇する一般的な問題をデバッグすることを難しくするだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top