2 Stimmen

Python shelve Fehler - behauptet NoneType, aber das Objekt *ist* da

Ich bin gerade auf einen total seltsamen Fehler gestoßen. Ich speichere eine Auswahl von Dingen in einer einzigen Datei. Eine davon ist eine Version einer Klasse namens Tracker, und diese Kopie wird tracker genannt.

 file = shelve.open(worldname, 'n')

        file['Terramap'] = terramap
        file['Satmap'] = satmap
        file['Gasmap'] = gasmap
        file['Planetset'] = planetset
        file['World'] = minimap
        file['Picture'] = picturemap                                    
        file['Worlddata'] = worlddata
        file['Dimension'] = dimension
        print "prüfen", len(tracker.families)
        file['Tracker'] = tracker
        file['Schedule'] = schedule
        file['Time'] = time
        file.close()      

Wenn ich kurz vor der Datei etwas von tracker ausdrucken lasse, nur um zu testen, ob tracker noch existiert, kann es tatsächlich den tracker erkennen. Aber dann, nur eine Zeile später, kommt folgendes:

  File "C:\Users\Mark\Desktop\Ultima Ratio Regum\URR0-2-1.py", Zeile 17522, in world_menu
    file['Tracker'] = tracker
  Datei "C:\Python27\lib\shelve.py", Zeile 132, in __setitem__
    p.dump(value)
TypeError: erwartet String- oder Unicode-Objekt, NoneType gefunden

Ich bin einfach... ratlos. Das ist noch nie passiert, und ich verstehe nicht, wie das sein kann! Kann jemand etwas Licht ins Dunkel bringen? Alles, was ich heute gemacht habe, war, einige Dinge zu tracker hinzuzufügen, aber tracker speichert eigentlich nur Listen von Strings, bis zu ein paar tausend, aber das war's. Wenn ich jedoch einen neuen tracker erstellen lasse, bevor das Speichern beginnt, speichert es einwandfrei.

EDIT:

Die Ausführung von pickle.dumps(tracker) zeigt:

  File "C:\Users\Mark\Desktop\Ultima Ratio Regum\29-12-test.py", Zeile 17515, in world_menu
    pickle.dumps(tracker)
  Datei "C:\Python27\lib\pickle.py", Zeile 1374, in dumps
    Pickler(file, protocol).dump(obj)
  Datei "C:\Python27\lib\pickle.py", Zeile 224, in dump
    self.save(obj)
  Datei "C:\Python27\lib\pickle.py", Zeile 286, in save
    f(self, obj) # Aufruf einer ungebundenen Methode mit explizitem self
  Datei "C:\Python27\lib\pickle.py", Zeile 725, in save_inst
    save(stuff)
  Datei "C:\Python27\lib\pickle.py", Zeile 286, in save
    f(self, obj) # Aufruf einer ungebundenen Methode mit explizitem self
...  
PicklingError: Can't pickle : it's not found as __main__.capitalize

5voto

Chris Morgan Punkte 78929

Diese Ausnahme stammt aus den internen Teilen von cPickle.Pickler.dump, erscheint jedoch nicht im Stacktrace, da sie sich in einem kompilierten C-Modul befindet. Um eine Vorstellung davon zu bekommen, was der Fehler ist, versuchen Sie, das Gleiche manuell auszulösen, aber mit dem reinen Python-Modul pickle anstelle des kompilierten C-Moduls cPickle:

import pickle
pickle.dumps(tracker)

Dies sollte enthüllen, wo der Fehler liegt. Mein erster Gedanke ist, dass Ihre Implementierung von __reduce_ex__ oder __reduce__ keinen Wert zurückgibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X