Пока что я сделал следующее:
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(<enum.Enum object at 0x02E80E50>, 0, 'FIRST'), EnumValue(<enum.Enum object at 0x02E80E50>, 1, 'SECOND')
<enum.Enum object at 0x02E80E50>
После того, как я распаковал и распечатал то же самое, я получил вывод:
[EnumValue(<enum.Enum object at 0x02E80E50>, 0, 'FIRST'), EnumValue(<enum.Enum object at 0x02E80E50>, 1, 'SECOND')
<enum.Enum object at 0x02ECF750>
Проблема в том, что адрес второго объекта меняется; При первой инициализации 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
enum.py
, которым вы поделились, в основном представляет собой пакетenum
, опубликованный на PyPI: pypi.python.org/pypi/enum - person Martijn Pieters   schedule 04.08.2012