これまでのところ、私がやったことは次のとおりです。
import pickle
class MyPickler(pickle.Pickler):
def __init__(self, file, protocol=None):
super(MyPickler, self).__init__(file, protocol)
class MyUnpickler(pickle.Unpickler):
def __init__(self, file):
super(MyUnpickler, self).__init__(file)
私の主な方法では、これは主に私が持っているものです
#created object, then...
pickledObject = 'testing.pickle'
with open(pickledObject,'wb') as f:
pickle = MyPickler(f)
pickle.dump(object) #object is the object I want to pickle, created before this
with open(pickledObject, 'r') as pickledFile:
unpickle = MyUnpickler(pickledFile)
object2 = unpickle.load()
ただし、スーパーメソッドが呼び出されると、次のエラーが発生します。
TypeError: must be type, not classobj
load と dump の 2 つのメソッドだけを上書きするにはどうすればよいでしょうか。pickle ファイルは C:\Python27/lib/pickle.py の下にあります。
編集 enum.py ファイルはここにあります: http://dpaste.com/780897/
オブジェクトの詳細: オブジェクトは次のように初期化されます。
object = CellSizeRelation(CellSizeRelation.Values.FIRST)
そして、CellSizeRelation は Enumeration を使用するクラスです:
class CellSizeRelation(Option):
Values = enum.Enum('FIRST',
'SECOND')
オブジェクトをピクルする前に、次のようにします。
print object.Values._values
print object.value.enumtype
出力
[EnumValue(<enum.Enum object at 0x02E80E50>, 0, 'FIRST'), EnumValue(<enum.Enum object at 0x02E80E50>, 1, 'SECOND')
<enum.Enum object at 0x02E80E50>
同じものを unpickle して出力すると、次の出力が得られます。
[EnumValue(<enum.Enum object at 0x02E80E50>, 0, 'FIRST'), EnumValue(<enum.Enum object at 0x02E80E50>, 1, 'SECOND')
<enum.Enum object at 0x02ECF750>
問題は、2 番目のオブジェクト アドレスが変更されることです。初めて初期化したとき、enumtype
と_values
は同じアドレスを持ちます。ただし、解凍後はアドレスが変わります。2 つの enumValue を比較しようとすると、コードが壊れます。クラスを見るとenumValue
、compare 関数は次のことを試みます。
try:
assert self.enumtype == other.enumtype
result = cmp(self.index, other.index)
アドレスが変更されるため、アサート関数は失敗します。unpickle されたときに enumtype のアドレスが変更されないようにする必要があります。私は単純に、ピクルされていないファイルから「FIRST」という値を取得し、そのインデックスを見つけて、次のようにオブジェクトを再初期化することを考えていました。
def load:
object = CellSizeRelation(CellSizeRelation.Values[INDEX])
return object