Пока что я сделал вот что:
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
Как перезаписать только два метода: загрузку и дамп? Файл рассола находится в 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(, 0, 'FIRST'), EnumValue(, 1, 'SECOND')
После того, как я распаковал и распечатал то же самое, я получил этот вывод :
[EnumValue(, 0, 'FIRST'), EnumValue(, 1, 'SECOND')
Проблема в том, что адрес второго объекта меняется; При первой инициализации enumtype
и _values
имеют одинаковый адрес. Однако после распаковки они меняют адреса. Это ломает мой код, когда я пытаюсь сравнить два значения enumValues. Если вы посмотрите в класс enumValue
, функция сравнения пытается сделать это:
try:
assert self.enumtype == other.enumtype
result = cmp(self.index, other.index)
Поскольку адрес изменяется, функция утверждения завершается ошибкой. Мне теперь как-то нужно убедиться, что адрес для enumtype не меняется при распаковывании. Я думал просто получить значение «ПЕРВЫЙ» из распакованного файла, узнать его индекс и повторно инициализировать объект с помощью:
def load:
object = CellSizeRelation(CellSizeRelation.Values[INDEX])
return object