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.