首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的酸洗弱引用

Python中的酸洗弱引用
EN

Stack Overflow用户
提问于 2014-05-14 10:58:58
回答 2查看 33.8K关注 0票数 16

我仍然是Python的新手,甚至是酸菜的新手。我有一个带有__getnewargs__()Vertex(ScatterLayout)

代码语言:javascript
复制
def __getnewargs__(self):
    return (self.pos, self.size, self.idea.text)

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

pickle在以下方法中调用(在不同的类MindMapApp(App)中):

代码语言:javascript
复制
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()方法时,我得到以下错误:

代码语言:javascript
复制
pickle.PicklingError: Can't pickle <type 'weakref'>: it's not found as __builtin__.weakref

我遗漏了什么或不理解什么?我还尝试实现了__getstate__() / __setstate__(state)组合,并获得了相同的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-12 02:06:14

你绝对可以腌制weakref,你也可以腌制dictlist。然而,它们所包含的内容实际上很重要。如果dictlist包含任何不可拾取的项,则酸洗将失败。如果你想要weakref,你必须使用dill,而不是pickle。然而,未酸洗的weakref反序列化为死引用。

代码语言:javascript
复制
>>> 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>
票数 13
EN

Stack Overflow用户

发布于 2017-08-09 18:59:38

我通过在__getstate__/__setstate__中的弱/强引用之间切换来解决此问题

代码语言:javascript
复制
class DBObject(object):
    def __getstate__(self):
        s = self.__dict__.copy()
        s['_db'] = s['_db']()
        return s

    def __setstate__(self, state):
        self.__dict__ = state.copy()
        self.__dict__['_db'] = weakref.ref(self.__dict__['_db'])
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23644920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档