Как отметил Безумный физик в комментарии ( Как я могу сделать 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()
теперь тоже будет работать.