如何使OrderedSet成为可选择的?

时间:2018-05-30 21:41:47

标签: python-3.x set pickle

集合的python文档链接到OrderedSet数据类型的recipie。此类的行为类似于集合,但保持插入顺序。

链接(页面底部): article

链接目标: https://docs.python.org/3/library/collections.abc.html?highlight=orderedset

我现在想让这个类成为pickleable,但是双向链表会导致递归错误。作为解决方案,我在此类中添加了以下方法:

def __getstate__(self):
    """ Avoids max depth RecursionError when dumping with pickle"""
    return list(self)

def __setstate__(self, state):
    """ Tells pickle how to restore instance using state """
    self.__init__(state)

这很有效,但在__init__内拨打__setstate__时,我觉得很烦人。此外,它需要从头开始重建链表。有没有更好的方法让这个班级可以选择?

1 个答案:

答案 0 :(得分:0)

正如Mad Physicist在评论(How can I make OrderedSet pickleable?)中所提到的,问题中提出的解决方案是合理的。为OrderedSet类定义以下方法可以为pickle提供存储所需的信息,然后重建OrderedSet的内容:

def __getstate__(self):
    """ Avoids max depth RecursionError when dumping with pickle"""
    return list(self)

def __setstate__(self, state):
    """ Tells pickle how to restore instance using state """
    self.__init__(state)

在内部,pickle会将OrderedSet的内容存储为list,然后可以通过调用OrderedSet __init__()方法重建OrderedSet使用存储的列表。

作为奖励,copy.deepcopy()会回归到pickle / unpickle,所以copy.deepcopy()现在也可以使用。