到目前为止,我所做的是:
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()
但是,当调用 super 方法时,这给了我以下错误:
TypeError: must be type, not classobj
如何只覆盖加载和转储这两种方法?pickle 文件位于 C:\Python27/lib/pickle.py 下
编辑 enum.py 文件可以在这里找到:http: //dpaste.com/780897/
对象详细信息:对象初始化如下:
object = CellSizeRelation(CellSizeRelation.Values.FIRST)
而 CellSizeRelation 是一个使用枚举的类:
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
具有相同的地址。但是,在 unpickling 之后,它们会更改地址。当我尝试比较两个枚举值时,这会破坏我的代码。如果你查看enumValue
类,比较函数会尝试这样做:
try:
assert self.enumtype == other.enumtype
result = cmp(self.index, other.index)
由于地址改变,assert 函数失败。我现在需要以某种方式确保枚举类型的地址在未腌制时不会改变。我正在考虑简单地从未腌制的文件中获取值“FIRST”,找出它的索引,然后使用以下命令重新初始化对象:
def load:
object = CellSizeRelation(CellSizeRelation.Values[INDEX])
return object