gpt4 book ai didi

python - 在 Python 中 pickle weakref

转载 作者:太空狗 更新时间:2023-10-29 21:34:29 24 4
gpt4 key购买 nike

我对 Python 还是很陌生,对 pickling 更陌生。我有一个带有 __getnewargs__() 的类 Vertex(ScatterLayout) :

def __getnewargs__(self):
return (self.pos, self.size, self.idea.text)

我的理解是,这将导致 pickle 从 __getnewargs__() 而不是对象的字典中 pickle 对象。

pickle 在以下方法中调用(在不同的类 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) 组合,结果相同。

最佳答案

你绝对可以序列化一个weakref,你可以序列化一个dict和一个list。基本上,重要的是对象包含什么。如果 dictlist 包含任何不可 pickl 的项,则 pickling 将失败。如果你想 pickle 一个 weakref,你必须使用 dill 而不是 pickledill 扩展了 pickle 以包含无法使用 pickle 进行 pickle 的对象。但是,请注意,对于 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>

关于python - 在 Python 中 pickle weakref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23644920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com