我在使用 pickle 时遇到了问题:我有一个棘手的用例,而且我没有取回我腌制的对象的副本。如果我从
class OneArg(object):
def __init__(self, somearg, *args, **kwargs):
print "In OneArgs's init with args={} and kwargs={}".format(args, kwargs)
self._somearg = somearg
super(OneArg, self).__init__(*args, **kwargs)
class OneArgSubclass(OneArg, OrderedDict):
def __init__(self, *args, **kwargs):
print "In OneArgSubclass's init with args={} and kwargs={}".format(args, kwargs)
super(OneArgSubclass, self).__init__(*args, **kwargs)
def verbose_pickle_dumps (obj):
result = pickle.dumps(obj)
print result
return result
oas = OneArgSubclass("SOMEARG")
oas['spam'] = 'eggs'
oas_red = pickle.loads(verbose_pickle_dumps(oas))
print "oas_red.keys():", oas_red.keys()
这是我得到的输出:
In OneArgSubclass's init with args=('SOMEARG',) and kwargs={}
In OneArgs's init with args=() and kwargs={}
oas.keys(): ['spam']
c__main__
OneArgSubclass
p0
((lp1
(lp2
S'spam'
p3
aS'eggs'
p4
aatp5
Rp6
(dp7
S'_somearg'
p8
S'SOMEARG'
p9
sb.
In OneArgSubclass's init with args=([['spam', 'eggs']],) and kwargs={}
In OneArgs's init with args=() and kwargs={}
oas_red.keys(): []
我可以看到,当我腌制 oas 时,'spam'/'eggs' 键/值对在那里,_somearg 的值也在那里。但是请注意,字符串“OrderedDict”没有出现。当我尝试从 pickle 加载 oas 时,它不会拾取字符串“SOMEARG”,因此字典的内容最终会作为 _somearg 的值。
我看过,oas 既没有 __getinitargs__() 也没有 __getnewargs__()。如果我使用常规字典而不是 OrderedDict,则代码可以工作(并且腌制表示看起来非常不同,包括提到“copy_reg”),所以我认为问题可能是腌制和 OrderedDict 之间的兼容性。但是当我单独使用 OrderedDict 时,pickle 可以正常工作。