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
Erweiterung von Objekten beim Abspeichern mit pickle
Hi,
Gruß
Norbert
übrigens: Willkommen bei Python. Hier werden Probleme gelöst, nicht umgangen...
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.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
Gruß
Norbert
übrigens: Willkommen bei Python. Hier werden Probleme gelöst, nicht umgangen...
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?
Danke, werde ich mir mal angucken.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.
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.str1442 hat geschrieben:Warum schreibst du also nicht einfach dein Programm entsprechend um bzw wo liegt das Problem dabei?