4

ランニング:

import pickle

class Foo(str):
    def __new__(cls, s, bar):
        self = super(Foo, cls).__new__(cls, s)
        self.bar = bar
        return self

with open('foo.pkl', 'wb') as w:
    x = pickle.dump(Foo('', 1), w, pickle.HIGHEST_PROTOCOL)

with open('foo.pkl', 'rb') as w:
    x = pickle.load(w)

この例外が発生します。

Traceback (most recent call last):
  File "pkl.py", line 13, in <module>
    x = pickle.load(w)
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj
    obj = cls.__new__(cls, *args)
TypeError: __new__() takes exactly 3 arguments (2 given)

を削除すれば機能しpickle.HIGHEST_PROTOCOLますが、可能であれば新しいプロトコルを使用したいと思います。

pickle プロトコルの説明がわかりません。誰でも私を助けることができますか?魔法のメソッドには何らかの方法があるはずです...

4

1 に答える 1

5

HIGHEST_PROTOCOL古いプロトコルはピクルされていない__new__オブジェクトにコンストラクターを使用しないため、これは なしで機能します。

しかし、基本はstr、新しい引数を に追加しているときに、 のシリアル化メソッドを使用しているということ__new__です。pickleモジュールも組み込みstr型もこれを認識していないため、示されているエラーが発生します。

それを修正するには、__getnewargs__メソッドを定義して、(self.__class__, self.bar)再び機能するのに十分な戻り値にする必要があります。

pickleモジュールで使用される特別なメソッドに関するドキュメントは、ここにあります

于 2013-01-10T00:05:51.060 に答える