Wie verwenden Sie dill zum serialisieren einer Klasse definition?
In der Antwort auf Python pickle: der Umgang mit Klassen-Definitionen aktualisiert, der Autor des dill
Paket schreibt:
"Ok, ich habe dieses feature zu dill in der neuesten Version auf github. Umgesetzt mit weit weniger Betrug, als ich dachte... einfach serialisieren der definition der Klasse, mit der Gurke, und voila."
Installation dill
und gebastelt, es ist mir nicht klar, wie Sie tatsächlich nutzen diese Funktionen in dill
. Könnte mir jemand eine explizite Beispiel? Ich würde gerne Gurke die Klasse, Instanz und auch serialisieren der Klasse definition.
(Ich bin neu in python und ich diese Funktionalität scheint sehr wichtig, da beim Beizen ein Objekt wäre es toll, so nah an eine Garantie als möglich, dass Sie sich auf das Objekt (könnte das Ergebnis einer simulation) in die Zukunft nach der definition der Klasse, kann sich geändert haben, und Sie haben nicht immer den überblick über alle änderungen in einer leicht zugänglichen Art und Weise.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie sind auf der Suche für eine der folgenden Funktionen...
Hier Baue ich eine Klasse und eine Instanz, und ändern Sie dann die Klassendefinition.
Die eingelegten Klasse und Instanz sind immer noch unpicklable weil
dill
Gurkender Quellcode für die Klasse standardmäßig... und verwaltet mehrere Klassen
mit dem gleichen Namen im Namensraum (es tut dies einfach, indem es die Verwaltung der Zeiger
Verweise auf die Klassen-Definitionen).
Gurke Blasen würde bis auf die oben genannten. Wenn Sie nicht möchten, dass
dill
zu serialisieren der Klasse explizit, und zu tun, waspickle
hat, dann kann man Fragendill
zu Gurke durch Bezugnahme mitdill.dumps(Foo, byref=True)
. Alternativ können Sie dynamisch entscheiden, zu ignorieren, die neu definierte Klasseignore=False
(der Standard).Nun, in dem Fall unten, arbeiten wir mit der neuen definition der Klasse, und extrahieren Sie die Quelle
von dem Objekt, dann speichern Sie es in eine Datei. Darüber hinaus können wir einen dump der Quelle in eine Datei (hier verwende ich eine temporäre Datei), damit es importiert werden kann später.
Ich hoffe, das hilft.
pickle
würde: AttributeError: 'Foo' - Objekt hat kein Attribut 'y'. circa Zeile 25). Schade, denn es Klang wie eine Instanz der Magie, und Sie würde die Speicherung dill-ed-Objekte in einer Datenbank mehr wartbar. So gibt es eine riesige Anwendungsfall. Dill 0.2.7.1, dill Einstellungen auf Standard (byref False). Ich hoffe, es ist operator Fehler, aber das Ausschneiden und einfügen ist fest in meinem skillset.ipython
-- so dass Sie werden müssen ausmisten mit etwas unerwartetes. Dies scheint, wie es ist, neues Verhalten. Hmm. Ich sah Ihr ticket, vielen Dank.dill.settings
explizit in der Lage sein, um umzuschalten, das Verhalten, das Sie wollte. Ich habe bearbeitet meine obige Antwort, um zu zeigen, dass.Wenn diese Funktionalität waren, die wichtig sind, wäre es in der Sprache-Kern, der von jetzt. 🙂
Also, Nein, das ist nicht entscheidend für die Verwendung von Python in irgendeiner erweiterten form - und wenn Sie ein Projekt haben, das stützt sich auf die in der Lage zu re-instanziieren von Objekten mit Sitz in alte Modelle, die möglich ist, müssen Sie sorgfältig darüber nachdenken, und wahrscheinlich halten die alten Modelle um im expliziten code, anstatt dann serialisiert.
Mein Rat ist, sich einfach "verlassen, dass Sie abgesehen", bis Sie denken, dass Sie es tatsächlich zu brauchen, und hatte im Vergleich mit anderen Lösungen, wie ein starkes Modell Migrationspolitik.
Sagte, ich habe versucht, dill, und es funktioniert wie beworben: es kann eine Klasse serialisieren
nur wie Gurke machen kann mit gewöhnlichen Objekten mit dem "dump" und "dumps" nennt, und den Wiederaufbau der Klasse Objekt mit "load" und "Lasten".
Was wahrscheinlich ist, bekommen Sie verwirrt ist, dass die Serialisierung eines Objekts (durch Gurke, dill oder dergleichen) nicht enthalten sind, weder Ihren source-code (also die eigentlichen Zeilen Text Python-code verwendet, um die Klasse zu definieren), noch seinen Namen.
So, wenn eine Klasse namens "A", wenn es serialisiert, wenn Sie müssen, dass dem Namen nach "undilling", in dem Sie neu zuordnen, die Namen in den globalen Namensraum. Es ist orignal name ist erhalten in der es
__name__
Attribut. (und für deine Zwecke mehrere Versionen des gleichen Modells zusammen zu Leben, das würde eine Menge Konflikte).Also: