Erweiterung von Objekten beim Abspeichern mit pickle

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Hallo,
vielleicht ist meine bisherige Methode suboptimal, aber ich habe keine Idee, wie man das Problem umgehen kann, da ich mich noch nicht so lange mit Python beschäftige.
ich benutze bisher in meinen Programmen die recht einfach Möglichkeit mit pickle um dort vorhandene Daten abzuspeichern. Dabei hatte ich jetzt schon mehrfach das Problem, dass ich z.B. eine Liste gepicklet habe, in der Objekte einer Klasse stehen und ich im Nachhinein diese Objekte mit zusätzlichen Attributen oder Methoden versehen möchte. Öffne ich die Liste mit der neuen Klassenbeschreibung meckert er verständlicherweise, da die gespeicherten Objekte ja noch nicht über die Methoden der neuen Klasse verfügen.
Bisher habe ich mir immer so, geholfen, dass ich ein Skript geschrieben habe, was die alte Liste mit den alten Objekte in eine neue Liste konvertiert. Das finde ich jedoch sehr umständlich. Jetzt kann man natürlich sagen, dass ich vorher bei der Konzeption der Klasse besser hätte überlegen können, jedoch waren mehrmals Attribute dabei, die mir bei der besten Planung nicht eingefallen wären.
Gibt es eine Möglichkeit das eleganter zu lösen oder bin ich mit pickle da sowieso nicht beim optimalen Werkzeug?
Wie umgeht ihr solche Probleme?

Gruß EmaNymton
ntrunk
User
Beiträge: 83
Registriert: Sonntag 7. September 2008, 23:09
Wohnort: Buchen (Odenwald)

Hi,
EmaNymton hat geschrieben:[...]
Gibt es eine Möglichkeit das eleganter zu lösen oder bin ich mit pickle da sowieso nicht beim optimalen Werkzeug?
Wie umgeht ihr solche Probleme?

Gruß EmaNymton
Schau dir mal in der Dokumentation zu pickle die Methoden object.__getstate__() und object.__setstate__(state) an, das könnte das sein, was du suchst.

Gruß
Norbert

übrigens: Willkommen bei Python. Hier werden Probleme gelöst, nicht umgangen... :wink:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Wenn du Klassen anlegst und erst während der Ausführung neue Methoden / Attribute hinzufügst oder du einfach deinen alten Quelltext aus irgendwelchen Gründen nicht verändern willst, ist dein Klassendesign mit an Sicherheit grenzender Wahrscheinlichkeit kaputt end of story. Google Monkeypatching. Wie du selbst bemerkt hast, kann Pickle Exemplare nur dann wieder rekonstruieren, wenn die Klasse, die verwendet wurde, als die Exemplare serialisiert wurden, in den essenziellen Teilen unverändert wieder vorgefunden wird. Wenn du dir also wirklich ins Knie schiessen willst, muss deine bisherige Vorgehensweise ([NewClass(...) for x in depickled]) ausreichen. Warum schreibst du also nicht einfach dein Programm entsprechend um bzw wo liegt das Problem dabei?
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

ntrunk hat geschrieben:Hi,

Schau dir mal in der Dokumentation zu pickle die Methoden object.__getstate__() und object.__setstate__(state) an, das könnte das sein, was du suchst.
Danke, werde ich mir mal angucken.
str1442 hat geschrieben:Warum schreibst du also nicht einfach dein Programm entsprechend um bzw wo liegt das Problem dabei?
Weil ich die Daten in den gepickelten Objekten gerne weiter verwenden möchte bzw. den Benutzern nicht die Arbeit auferlegen will alle Daten neu einzugeben.
Antworten