pickle ist eine Standardbibliothek zum Serialisieren von Python-Objekten in Bytes zur Speicherung in Dateien und dergleichen.
Welche Art von Objekt gebeizt werden kann, ist [Beizreferenz] Es gibt eine Beschreibung in (https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled), aber das Phänomen, dass Objekte, die aufeinander verweisen, nicht gut aufgehoben werden können Ich habe es überprüft und es scheint, dass ein ungelöstes Problem vorliegt, wie in This Issue Tracker beschrieben.
Wenn ich das folgende Skript ausführe und mit "pickle.loads" die Auswahl aufhebe, erhalte ich "AttributeError: Das Objekt" Node "hat kein 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)
Dieser Fehler tritt auf, weil das "n" des Knotenobjekts die folgenden Bedingungen erfüllt und Objekte, die diese Bedingungen erfüllen, möglicherweise nicht "pickle / unpickle" sind.
n
verweist zyklisch auf sich selbst als Element des set
-Objekts von n.next_nodes
.Dies ist ein Fehler, der 2007 gemeldet wurde, aber in Ichute Tracker ist dies ein seltener Fall und es ist schwierig, ihn zu beheben. Daher wurde er ohne Behebung erneut geöffnet und ist immer noch behoben Es scheint nicht so zu sein.