Warum kann Pythons string.format Pad nicht mit "\ x00"?

8

Ich wollte eine Zeichenfolge mit Nullzeichen ("\ x00") auffüllen. Ich kenne viele Möglichkeiten, dies zu tun, also bitte nicht mit Alternativen antworten. Was ich wissen will, ist: Warum erlaubt Pythons string.format() -Funktion kein Auffüllen mit Nullen?

Testfälle:

%Vor%

Dies zeigt, dass Hex-Escape-Zeichen im Allgemeinen funktionieren.

%Vor%

Aber "\ x00" wird in ein Leerzeichen ("\ x20") umgewandelt.

%Vor%

Auch versuchen ein paar andere Möglichkeiten, es zu tun.

%Vor%

Dies funktioniert, aber nicht string.format

%Vor%

Python ersetzt eindeutig Leerzeichen ( chr(0x20) ) anstelle von Nullen ( chr(0x00) ).

    
bonsaiviking 24.05.2013, 18:29
quelle

3 Antworten

0

Weil die Methode string.format in Python2.7 ein Backport von Python3 string.format ist. Python2.7 Unicode ist die Python 3-Zeichenfolge, wobei die Python2.7-Zeichenfolge die Python3-Byte ist. Eine Zeichenfolge ist der falsche Typ zum Ausdrücken binärer Daten in Python3. Sie würden Bytes verwenden, die keine Formatmethode haben. Also solltest du dich wirklich fragen, warum die format -Methode überhaupt für String in 2.7 ist, wenn sie eigentlich nur auf dem Unicode-Typ hätte sein sollen, da dies der String in Python3 wurde.

Was ich denke, diese Antwort ist, dass es zu bequem ist, es dort zu haben.

Aus diesem Grund gibt es noch keine format auf Bytes noch

    
cmd 24.05.2013, 19:39
quelle
4

Wenn ich in den Quellcode für Python 2.7 einchecke, habe ich festgestellt, dass das Problem in diesem Abschnitt von ./Objects/stringlib/formatter.h , Zeilen 718-722 (in Version 2.7.3) liegt:

%Vor%

Das Problem ist, dass ein Null / Null-Zeichen ( 'format->fill_char = ' ';' ) als Standard verwendet wird, wenn kein Füllzeichen angegeben ist. Dies ist, um dieses Verhalten zu aktivieren:

%Vor%

Es ist möglich, parse_internal_render_format_spec() als Standard in ./Objects/stringlib/formatter.h:186 at '%code%' zu setzen, aber es gibt ein bisschen Rückwärtskompatibilität, die später auf %code% überprüft wird. Auf jeden Fall ist meine Neugier befriedigt. Ich werde die Antwort von jemand anderem akzeptieren, wenn es mehr Geschichte oder eine bessere Erklärung für warum als das hat.

    
bonsaiviking 24.05.2013 19:57
quelle
2

Die Antwort auf die ursprüngliche Frage ist, dass es ein Fehler in Python war.

Es wurde dokumentiert als erlaubt, war es aber nicht. Es wurde im Jahr 2014 behoben. Für Python 2 erschien der Fix entweder in 2.7.7 oder 2.7.8 (ich weiß nicht, wie ich sagen soll)

Ursprüngliches Problem .

    
sbrodie 17.05.2016 17:27
quelle

Tags und Links