在Python中腌制weakref
我对Python还是很陌生,甚至对酸洗也比较新。我有一个类Vertex(ScatterLayout)
有__getnewargs__()
:
def __getnewargs__(self):
return (self.pos, self.size, self.idea.text)
我的理解是,这将使泡菜从对象__getnewargs__()
而不是从字典中提取对象。
在以下方法中(在另一个类中MindMapApp(App)
)调用泡菜:
def save(self):
vertices = self.mindmap.get_vertices()
edges = self.mindmap.get_edges()
output = open('mindmap.pkl', 'wb')
#pickle.dump(edges, output, pickle.HIGHEST_PROTOCOL)
pickle.dump(vertices, output, pickle.HIGHEST_PROTOCOL)
output.close()
当我调用该save()
方法时,出现以下错误:
pickle.PicklingError: Can't pickle <type 'weakref'>: it's not found as __builtin__.weakref
我缺少或不了解什么?我也尝试实现__getstate__()
/__setstate__(state)
组合,结果相同。
-
你绝对可以泡菜a
weakref
,泡菜adict
和a
list
。但是,实际上它们包含的内容很重要。如果dict
或list
包含不可拾取的intem,则酸洗将失败。如果您想泡菜weakref
,就必须使用dill
而不是pickle
。weakref
但是,未经挑选的反序列化为无效参考。>>> import dill >>> import weakref >>> dill.loads(dill.dumps(weakref.WeakKeyDictionary())) <WeakKeyDictionary at 4528979192> >>> dill.loads(dill.dumps(weakref.WeakValueDictionary())) <WeakValueDictionary at 4528976888> >>> class _class: ... def _method(self): ... pass ... >>> _instance = _class() >>> dill.loads(dill.dumps(weakref.ref(_instance))) <weakref at 0x10d748940; dead> >>> dill.loads(dill.dumps(weakref.ref(_class()))) <weakref at 0x10e246a48; dead> >>> dill.loads(dill.dumps(weakref.proxy(_instance))) <weakproxy at 0x10e246b50 to NoneType at 0x10d481598> >>> dill.loads(dill.dumps(weakref.proxy(_class()))) <weakproxy at 0x10e246ba8 to NoneType at 0x10d481598>