Как я могу сделать OrderedSet маринованным? - PullRequest
0 голосов
/ 31 мая 2018

Документация Python о коллекциях ссылается на получателя для типа данных OrderedSet.Этот класс ведет себя как набор, но поддерживает порядок вставки.

Ссылка (внизу страницы): https://docs.python.org/3/library/collections.abc.html?highlight=orderedset

Цель ссылки: https://code.activestate.com/recipes/576694/

Я бы сейчасЯ хотел бы сделать этот класс доступным для выбора, но двусвязный список приводит к ошибкам рекурсии.В качестве решения я добавил следующие методы в этот класс:

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 голосов
/ 31 мая 2018

Как отметил Безумный физик в комментарии ( Как я могу сделать OrderedSet маринованным? ), решение, предложенное в этом вопросе, является разумным.Определение следующих методов для класса 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 как * 1007.*, а затем можно восстановить OrderedSet, вызвав метод __init__() для OrderedSet с сохраненным списком.

В качестве бонуса copy.deepcopy() возвращается к маринованию / расслоению, поэтому copy.deepcopy()теперь тоже будет работать.

...