Python: pickle misbehaving in django shell im Gegensatz zu python shell?

Als eine weitere Frage, die aus meiner vorherigen Frage stammt , stellt sich heraus, dass sich die Essiggurke im Django-Shell im Vergleich zur Pythonschale anders verhält …

Dieses Skript:

import pickle class TestObj(object): pass testobj = TestObj() pickled = pickle.dumps(testobj, pickle.HIGHEST_PROTOCOL) 

Wird in der Pythonschale gut funktionieren, aber in der Django-Shell wird ein PickleError entlang der Zeilen von PickleError PicklingError: Can't pickle <class 'TestObj'>: attribute lookup __builtin__.TestObj failed

Ist jemand in der Lage, das Problem hier zu erklären? Und wenn möglich, verknüpfe es zurück zu meiner vorherigen Frage?

    2 Solutions collect form web for “Python: pickle misbehaving in django shell im Gegensatz zu python shell?”

    pickle wird sicherstellen, dass es eine Klasse wieder importieren kann, da nur die Daten auf der Instanz selbst eingelegt werden, plus der Importort der Klasse. Als solche sucht pickle das __module__ Attribut auf die Klasse, um zu bestimmen, woher es kam.

    Es scheint die Django interaktive Umgebung nicht gesetzt dieses __module__ Attribut; Als Ergebnis wird TestObj.__module__ stattdessen von der object geerbt und das ist __builtin__ . Vielleicht ist kein __name__ global gesetzt. Infolgedessen endet das pickle Modul an der falschen Stelle für Ihre Klasse. Es gibt kein __builtin__.TestObj schließlich.

    Aus den Kommentaren sammle ich, dass du versuchst, verspottete Objekte im Django-Cache zu speichern. Das wird nicht funktionieren, da Mock-Objekte nicht ablesbar sind . Das macht Sinn, wie bei der Entflechtung (was in einem völlig neuen Python-Prozess sein könnte), wie würde pickle wissen, was die ursprüngliche Klasse verspottet wurde?

    Könnten Sie nicht einfach einen Serializer verwenden, der keine Klassen per Referenz platziert … und dann vor-serialisieren, was Sie in den Django-Cache übergeben? Dies würde nicht nur die Instanz, sondern auch die Klassendefinition selbst speichern, die es Ihnen erlaubt, die Instanz irgendwo zu rekonstruieren.

    Sehen Sie meine Antwort auf Ihre ursprüngliche Frage: Pickle kann nicht speichern ein Objekt in django locmem Cache während Tests?

    Ich weiß nichts über django Mock Objekte, oder wenn es etwas besonders unpicklable über sie … Aber solange sie aus Python-Code gebaut sind (im Gegensatz zu eingebaut in C, und haben eine dünne Python-Wrapper-Schicht), dann die oben Sollte wahrscheinlich funktionieren

    Python ist die beste Programmiersprache der Welt.