Ich habe eine Menge Legacy-Code zum Verschlüsseln von E-Mails, die viele Druckanweisungen wie
enthalten %Vor% Das ist alles gut und gut für E-Mails, aber wir nutzen jetzt den gleichen Code für die Ausgabe von HTTP-Anfragen. Das Problem besteht darin, dass die Python-Druckanweisung '\n'
ausgibt, während HTTP '\r\n'
erfordert.
Es sieht so aus, als ob Python (mindestens 2.6.4) einen nachgestellten PRINT_NEWLINE
-Bytecode für eine print-Anweisung erzeugt, die als
Es scheint also, dass es keine einfache Möglichkeit gibt, das Standard-Newline-Verhalten von print zu überschreiben. Ich habe die folgenden Lösungen in Betracht gezogen
.replace('\n', '\r\n')
. Dies stört HTTP-Nachrichten, die Multipart-Codierung verwenden. .write
-Methode
print >>f, text
in f.write(text + line_end)
übersetzt, wobei line_end
'\n'
oder '\r\n'
sein kann. Ich glaube, die dritte Option wäre am besten geeignet. Es wäre interessant zu hören, was Ihr pythonischer Ansatz für das Problem wäre.
Sie sollten Ihr Problem jetzt und für immer lösen, indem Sie eine neue Ausgabefunktion definieren. Wäre Drucken eine Funktion, wäre das viel einfacher gewesen.
Ich schlage vor, eine neue Ausgabefunktion zu schreiben, die so viel wie möglich von der modernen Druckfunktionssignatur nachahmt (weil die Wiederverwendung einer guten Schnittstelle gut ist), zum Beispiel:
%Vor% Wenn Sie alle gewünschten Ausdrucke ersetzt haben, haben Sie dieses Problem nicht mehr - Sie können stattdessen immer das Verhalten Ihrer Funktion ändern! Dies ist ein wichtiger Grund, warum Drucken in Python 3 zu einer Funktion wurde - denn in Python 2.x durchlaufen "alle" Projekte unweigerlich die Phase, in der alle print
-Anweisungen nicht mehr flexibel sind und es keinen einfachen Weg gibt aus.
(Ich bin mir nicht sicher, ob / ob das zu dem Wrapper passt, den Sie verwenden möchten, aber für den Fall ...)
In Python 2.6 (und vielen Vorgängerversionen) können Sie den Zeilenumbruch unterdrücken, indem Sie am Ende der print-Anweisung ein Komma hinzufügen, wie in:
%Vor%Der Nachteil dieses Ansatzes besteht jedoch darin, dass die Druck-Syntax und das Verhalten in Python3 geändert werden.
Ich denke, ich würde eine neue Funktion writeline
in einer geerbten Datei / Stream-Klasse definieren und den Code aktualisieren, um writeline
anstelle von print
zu verwenden. Das Dateiobjekt selbst kann den Zeilenendungsstil als Mitglied enthalten. Das sollte Ihnen eine gewisse Flexibilität im Verhalten geben und den Code ein wenig klarer machen, d. H.% Co_de% im Gegensatz zu f.writeline(text)
.
Ich bevorzuge auch Ihre dritte Lösung, aber keine Notwendigkeit, f.write zu verwenden, würde jede vom Benutzer geschriebene Funktion / callable tun. So würden die nächsten Änderungen einfach werden. Wenn Sie ein Objekt verwenden, können Sie sogar die Zieldatei darin verstecken und so ein wenig Syntaxrauschen wie eine Datei oder eine Art Newline entfernen.
Schlechter Druck ist eine Anweisung in Python 2.x, mit Python 3.x Druck könnte einfach durch etwas Benutzerdefiniert überladen werden.
Python verfügt über Module, die E-Mail- und HTTP-Header auf einfache Weise kompatibel handhaben. Ich schlage vor, Sie verwenden sie, anstatt bereits gelöste Probleme wieder zu lösen.