Ausfürliche Definition der pickle Protokolle

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

JSON ist gar keine so dumme Idee aber knapp vorbei ist auch vorbei.

Code: Alles auswählen

>> import yaml
>> a = [1, 2]
>> b = [a, a]
>> b
 > [[1, 2], [1, 2]]
>> c = yaml.load(yaml.dump(b))
>> c
 > [[1, 2], [1, 2]]
>> c[0][1] = 42
>> c
 > [[1, 42], [1, 42]]
>> print yaml.dump(b)
- &id001 [1, 2]
- *id001
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Es hat ungefähr 15 Minuten gedauert, einen eigenen Serializer zu bauen, der so einfach ist, dass man sicherlich auch ein PHP-Gegenstück bauen kann und der dies kann:

Code: Alles auswählen

>>> d = {1: "zwei", 3: [True]}; d[3].append(d)
>>> Serializer().write(d)
"{(I1S'zwei';(I3[TR0;;;"
Das { steht für dict, ( für tuple, I für int und S für str. Danach kommen jeweils die Daten. Sequenzen werden mit ; beendet. Das R ist eine Referenz, damit rekursive Datenstrukturen funktionieren. Der Encoder hat 21 Zeilen, der Decoder 26.

http://gist.github.com/151889

Stefan
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Sieht nett aus!

Zwei Anmerkungen: Strings mit Single-Quotes und negative Integers mag das Ding nicht, und das Slicing von m.group() könnte man vermeiden, wenn man die Gruppen in der Regex auf den eigentlichen Wert einschränkt. Ach ja, und es dürfte schneller sein, den String nicht nach jedem Match zu slicen, sondern einfach einen Startindex i zu inkrementieren und ihn re.match mitzugeben (dafür braucht es aber ein regex-Objekt).
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hatte nicht bedacht, dass `repr()`von ' auf " wechselt, wenn ein ' im String vorkommt. Das und negative Zahlen werden jetzt erkannt. Für Strings ist der reguläre Ausdruck allerdings immer noch zu trivial, denn er erkennt keine \. Das überlasse ich dem Leser als Übung.

Ansonsten habe ich nach birkenfelds Blick den Code nochmals geändert, weil mir doch 40 Zeilen für den Decoder einfach zu viel waren. Auf Effizienz hatte ich zwar überhaupt nicht geachtet, aber ich denke, das neue Verfahren würde besser performen, wenn einem das wichtig wäre.

Stefan
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

LOC durch 1-Zeilen-Suiten zu sparen, ist natürlich keine Kunst :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Sind True und False in 3.0 nun genau wie None "Singletons"? Nachdem ich den Quelltext von sma gesehen hatte, habe ich in den What's new Dokumenten + Language Reference nachgeschlagen, habe aber nur herausgefunden, das beide nun wie None "reservierte Wörter" geworden sind.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:Sind True und False in 3.0 nun genau wie None "Singletons"?
Ja, sind sie. Siehe ``help(bool)`` (aber das waren sie auch schon vorher, mindestens seit Python 2.5).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

sma hat geschrieben:Ansonsten habe ich nach birkenfelds Blick den Code nochmals geändert, weil mir doch 40 Zeilen für den Decoder einfach zu viel waren.
Genau DAS mag ich an sma :D
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Leonidas hat geschrieben:
str1442 hat geschrieben:Sind True und False in 3.0 nun genau wie None "Singletons"?
Ja, sind sie. Siehe ``help(bool)`` (aber das waren sie auch schon vorher, mindestens seit Python 2.5).
Schon seit sie in Python 2.2.x eingeführt wurden.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Das auch schon in 2.5 (und wie ich ja gerade gelesen habe, auch darunter) von beiden nur ein Exemplar existiert, wußte ich bereits, aber meine Frage war eher darauf gerichtet, ob das ein Implementierungsdetail ist oder nicht, ähnlich wie bei allen int Objekten unter einer bestimmten Grenze (ich glaube es war 256?), die ja auch gecacht werden, obwohl dieses Verhalten von CPython eben ein Implementierungsdetail ist. Sollte es also keins sein, mag es sein, das ich aufgrund der "reservierte Wörter" Geschichte, dem Cachen von normalen Integern und alten Postings aus dem Forum annahm, es wäre eins (Meine Güte, heute baue ich wieder wundervolle Sätze :roll:).

tl;dr: Da es in der Dokumentation für Bool steht, ist das also garantiert - Danke :)
Antworten