[Python-de] Aus r'\012' einen Zeilenumbruch ohne if erzeugen

Georg Mischler schorsch at schorsch.com
Mon Feb 10 15:03:40 EST 2003


Martin Möllenbeck wrote:

> Hallo Georg,
>
> in der INI-Datei sollte unter dem Schluessel eine <newline> gespeichert
> werden.
>
> Auszug aus der INI-Datei:
> <snip>
> lineseparator = \012
> <snip>
>
> Wenn ich diesem Wert in der Ini-Datei speichere, bekomme ich beim
> Auslesen den Wert
> "r'\012'". Jetzt moechte ich aus diesem Text das 'eigentliche' Newline
> bekommen.


Ah, jetzt verstehe ich...

Ein binaeres <newline> ist als Wert in einer solchen Datei nicht
moeglich, weil das gleiche Zeichen ja die einzelnen Eintraege
voneinander trennt. Du musst also tatsaechlich die explizite
Zeichenfolge '\012' da reinschreiben.
So weit, so gut.

Mir ist allerdings keine eingebaute Funktion bekannt, welche
diese Form in die jeweilige binaere Representation umformt.
Normalerweise wird sie ja nur als "literal" im Code verwendet.
Damit kriegen wir aber auch gleich wieder eine Hintertuer. Wir
bauen den String einfach in ein Stueck Code ein, und fuehren
diesen direkt aus:

def decode_literal(s):
	statement = compile('value = "%s"' % s, '', 'single')
	exec statement
	return value

Das ist ein ziemlich fortgeschrittenes Voodoo-Ritual, aber es
funktioniert erst mal... Wenn du dabei sicherheitstechnische
Bedenken hast (zurecht!), dann solltest du vorher noch dafuer
sorgen, dass s keine Klammern, Semikolons oder echte <newline>s
etc. enthaelt. Diese wuerden es naemlich moeglich machen, deine
Funktion mittels einer untergeschobenen Datei beliebigen Code
ausfuehren zu lassen. Das waere dann das Python-Aequivalent
der beruehmten Buffer-Overflows in C. Sicher bist du z.B. dann,
wenn du nur einen fuehrenden Backslash und nachfolgende Zahlen
akzeptierst, was fuer deinen Zweck ja reichen sollte.


-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/





More information about the Python-de mailing list