2012-04-06 14 views
0

Ich möchte eine Zeichenfolgendarstellung eines Python-Objekts haben. Ich habe es mit der berühmten Gurke gemacht, aber ich frage mich, ob es etwas besseres und weniger teuer gibt. Ich benutze nicht gerne Rep und Eval, weil sie nicht sicher sind.Objektdarstellung in Python

+2

Pickle ist auch nicht sicher, schauen Sie sich die Warnung rechts oben in der ['pickle' Dokumente] (http://docs.python.org/library/pickle.html) – agf

Antwort

1

YAML ist ein ziemlich anständiges Format zum Serialisieren von Datenstrukturen. Es ist wie JSON, aber mehr. Die PyYAML Bibliothek funktioniert ziemlich gut. Sie können nicht nur schätzen, wie Datenstrukturen serialisiert werden, sondern Sie können auch ziemlich spezifisch werden. Beispiele finden Sie in der vollständigen Dokumentation.

+0

YAML oder JSON wäre ein gute Wahl. –

+0

Das Schöne an JSON ist, dass es sich nicht nur um eine Standardbibliothek handelt, sondern auch um eine Teilmenge von YAML. Wenn Sie also mit JSON beginnen und später zu YAML wechseln, kann der YAML-Parser die Daten weiterhin lesen. YAML sieht im Allgemeinen jedoch besser aus und hat einige Funktionen, die JSON fehlen. Normalerweise mache ich meine Objektdumpers fallback zu JSON wenn möglich, wenn 'Import Yaml' fehlschlägt. – kwatford

0

Wenn Sie nach Objektdarstellung Serialisierung meinen, dann ist Pickle eine Option. Wenn Sie eine schnellere Implementierung wünschen, versuchen Sie cPickle

1

Verwenden Sie repr(), um die Zeichenfolgendarstellung zu erhalten, und ast.literal_eval(), um das Objekt wiederherzustellen.

Oder einfach Gurke verwenden. Wenn Sie Python 2.x verwenden, können Sie import cPickle eine schnellere Gurke erhalten, aber in Python 3.x gibt es nur die eine Gurke und es ist die C-Gurke.

Persönlich möchte ich JSON für einfache Objekte verwenden; Sie könnten versuchen import json und sehen, ob es für Sie funktioniert.

+0

ast.literal_eval() und eval() sind keine exakte Wissenschaft. Wurde mit komplexen Objekten fehlgeschlagen. – Academia

+0

'ast.literal_eval()' rekonstruiert ein Objekt nicht von seinem 'repr()', außer in einigen wenigen Fällen. In der Tat, in dem allgemeinen Fall, wo '__repr__' nicht überladen ist, und das Objekt ** nicht ** aus seinem' repr() 'rekonstruiert werden kann, weil das einfach aussieht wie '. –

+0

Auch wenn Sie sagen, eine unveränderliche Klasse, die immer schließen kann, mit welchen Argumenten sie konstruiert wurde, und '__repr__' überladen, um eine Zeichenfolge zu erzeugen, die wie ein Konstruktoraufruf aussieht, wird' ast.literal_eval() 'immer noch nicht verarbeiten weil es ein Ausdruck ist, kein Wort. Sie müssten nach "eval" wechseln, was unsicher ist. –