Un cas particulier où le pickle provoque une erreur

pickle est une bibliothèque standard pour sérialiser des objets Python en octets pour le stockage dans des fichiers et autres.

Quel type d'objet peut être décapé est [référence pickle] Il y a une description dans (https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled), mais le phénomène selon lequel les objets qui se réfèrent les uns aux autres ne peuvent pas être bien décapés Je l'ai vérifié, et il semble qu'il y ait un problème non résolu comme décrit dans This Issue Tracker.

Quand j'exécute le script suivant, quand je désélectionne avec pickle.loads, j'obtiens ʻAttributeError: l'objet 'Node' n'a pas d'attribut'i'`` `.

python


# modified from https://bugs.python.org/file2428/circle.py

import pickle

class Node(object):
    def __init__(self, i):
        self.i = i

    def __cmp__(self, other):
        return cmp(self.i, other.i)

    def __hash__(self):
        return hash(self.i)

n = Node(12)
n.next_nodes = set((n,))

byteobj = pickle.dumps(n)
unpickled = pickle.loads(byteobj)

Cette erreur se produit car le «n» de l'objet Node remplit les conditions suivantes et les objets qui remplissent ces conditions peuvent ne pas être pickle / unpickle.

C'est un bogue signalé en 2007, mais dans Ichute Tracker, c'est un cas rare et il est difficile de le corriger, il a donc été rouvert à moins qu'il ne soit corrigé, et il est toujours corrigé. Cela ne semble pas être le cas.

Recommended Posts

Un cas particulier où le pickle provoque une erreur
[Note] La solution pour celle où Python devient une erreur avec import hashlib sur MacOSX
Un mémorandum lorsqu'une erreur se produit avec pip install