Wie erreiche ich sprintf-style-Formatierung für Byte-Objekte in Python 3?

9

Ich möchte sprintf auf python3 ausführen, aber mit rohen Bytes-Objekten, ohne manuelle Konvertierungen durchführen zu müssen, damit% s funktioniert. Nehmen Sie also ein Byte-Objekt als 'Vorlage' plus eine beliebige Anzahl von Objekten eines beliebigen Typs und geben Sie ein gerendertes Byte-Objekt zurück. So hat der Operator sprintf% von python 2 immer funktioniert.

%Vor%

Aber in Python 2 ist es nur eingebaut:

%Vor%

Gibt es eine Möglichkeit, dies in Python 3 zu tun, aber immer noch die gleiche Leistung von Python 2 zu erreichen? Bitte sag mir, dass ich etwas vermisse. Der Rückfall hier ist in Cython implementieren (oder gibt es Bibliotheken für Python 3, die dabei helfen?), Aber immer noch nicht sehen, warum es aus der Standardbibliothek entfernt wurde, außer der impliziten Codierung des String-Objekts. Können wir nicht einfach eine Byte-Methode wie format_any () hinzufügen?

Übrigens ist es nicht so einfach wie das Aussperren:

%Vor%

Ich möchte nicht nur unnötige Kodierung / Dekodierung machen, sondern die Bytesargumente werden reprodiert anstatt roh injiziert zu werden.

    
parity3 29.07.2017, 04:00
quelle

2 Antworten

2
  

Ich möchte sprintf auf python3 aber mit rohen Bytes-Objekten ausführen, ohne manuelle Konvertierungen durchführen zu müssen, damit% s funktioniert.

Damit dies funktioniert, müssen alle Formatierungsargumente bereits bytes sein.

Dies hat sich seit Py2 geändert, wodurch sogar Unicode-Strings in einer Byte-Zeichenfolge formatiert werden konnten, da die Py2-Implementierung fehleranfällig ist, sobald eine Unicode-Zeichenfolge mit Unicode-Zeichen eingeführt wird.

ZB auf Python 2:

%Vor%

Technisch ist das richtig, aber nicht was der Entwickler beabsichtigt hat. Es berücksichtigt auch keine Codierung.

In Python 3 OTOH:

%Vor%

Verwenden Sie zum Formatieren von Byte-Strings Byte-String-Argumente (nur Py3.5 +)

%Vor%

Andere Typen wie Integer müssen ebenfalls in Byte-Strings konvertiert werden.

    
danny 07.08.2017 13:35
quelle
1

Würde so etwas für Sie funktionieren? Sie müssen nur sicherstellen, dass, wenn Sie ein bytes -Objekt beginnen, Sie es in das neue B bytes-ähnliche Objekt umbrechen, das die Operatoren % und %= überlädt:

%Vor%

Dies gibt aus:

%Vor%     
mattjegan 02.08.2017 01:24
quelle