Überschreibt das Newline-Generierungsverhalten von Pythons print-Anweisung

7

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

implementiert ist %Vor%

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

  • Nach dem Schreiben der Ausgabe einfach ein .replace('\n', '\r\n') . Dies stört HTTP-Nachrichten, die Multipart-Codierung verwenden.
  • Erstellen Sie einen Wrapper um das Zieldateiobjekt herum und stellen Sie die .write -Methode
  • als Proxy bereit %Vor%

  • Schreibe einen regulären Ausdruck, der 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.

        
    brotchie 04.11.2009, 23:36
    quelle

    6 Antworten

    10

    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.

        
    u0b34a0f6ae 05.11.2009, 01:25
    quelle
    8

    (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.

        
    mjv 04.11.2009 23:48
    quelle
    4

    In python2.x können Sie Folgendes tun:

    %Vor%

    um die nachfolgende neue Zeile zu unterdrücken.

    In python3.x ist es viel einfacher:

    %Vor%     
    sykora 05.11.2009 00:45
    quelle
    0

    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) .

        
    codelogic 05.11.2009 00:37
    quelle
    0

    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.

        
    kriss 05.11.2009 01:15
    quelle
    0

    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.

        
    Lennart Regebro 05.11.2009 10:34
    quelle

    Tags und Links