Как перезаписать методы дампа/загрузки в классе pickle -, настроив травление и распаковку -Python

Пока что я сделал вот что:

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

5
задан SaiyanGirl 3 August 2012 в 19:56
поделиться