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.
__hash__
.n
se référence de manière circulaire comme un élément de l'objet set
de n.next_nodes
. __hash__
est utilisée (car c'est un élément de set
)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.