9

次のような多くの印刷ステートメントを含む生の電子メールをエンコードするためのレガシーコードがたくさんあります。

print >>f, "Content-Type: text/plain"

これはすべてメールに適していますが、現在は同じコードを使用してHTTPリクエストを出力しています。'\n'問題は、HTTPがを必要とするのにPythonのprintステートメントが出力されることです'\r\n'

Python(少なくとも2.6.4)は、次のようにPRINT_NEWLINE実装されたprintステートメントの末尾のバイトコードを生成するようです。

ceval.c:1582: err = PyFile_WriteString("\n", w);

したがって、印刷のデフォルトの改行動作をオーバーライドする簡単な方法はないようです。私は次の解決策を検討しました

  • 出力を書き込んだ後、単に。を実行し.replace('\n', '\r\n')ます。これは、マルチパートエンコーディングを使用するHTTPメッセージに干渉します。
  • .write宛先ファイルオブジェクトのラッパーを作成し、メソッドをプロキシします
  • def write(self, data):
        if data == '\n':
            data = '\r\n'
        return self._file.write(data)
    

  • どこにあるか、またはに変換print >>f, textされる正規表現を記述します。f.write(text + line_end)line_end'\n''\r\n'
  • 3番目のオプションが最も適切だと思います。問題に対するPythonicのアプローチがどうなるかを聞くのは興味深いでしょう。

    4

    6 に答える 6

    10

    新しい出力関数を定義することにより、今、そして永遠に問題を解決する必要があります。関数を出力した場合、これははるかに簡単でした。

    たとえば、最新の印刷関数のシグネチャをできるだけ模倣して、新しい出力関数を作成することをお勧めします(優れたインターフェイスを再利用するのが良いため)。

    def output(*items, end="\n", file=sys.stdout):
        pass
    

    問題のすべてのプリントを置き換えると、この問題は発生しなくなります。代わりに、関数の動作をいつでも変更できます。これが、Python 3でprintが関数になった大きな理由です。Python2.xでは、「すべての」プロジェクトは常に、すべてのprintステートメントが柔軟でなくなり、簡単な方法がない段階を通過するためです。

    于 2009-11-05T01:25:38.740 に答える
    8

    (これが使用するラッパーにどのように適合するかはわかりませんが、場合によっては...)

    Python 2.6(および以前の多くのバージョン)では、次のように、printステートメントの最後にコンマを追加することで改行を抑制することができます。

    data = 'some msg\r\n'
    print data,  # note the comma
    

    ただし、このアプローチを使用することの欠点は、Python3で印刷構文と動作が変更されることです。

    于 2009-11-04T23:48:07.830 に答える
    4

    python2.xでは、次のことができると思います。

    print >>f "some msg\r\n",
    

    末尾の改行を抑制します。

    python3.xでは、はるかに簡単です。

    print("some msg", end = "\r\n", file = f)
    
    于 2009-11-05T00:45:44.747 に答える
    0

    writeline継承されたファイル/ストリームクラスで新しい関数を定義し、のwriteline代わりに使用するようにコードを更新すると思いますprint。ファイルオブジェクト自体は、行末スタイルをメンバーとして保持できます。これにより、動作にある程度の柔軟性がもたらされ、コードが少し明確になります。つまりf.writeline(text)、とは対照的f.write(text+line_end)です。

    于 2009-11-05T00:37:29.820 に答える
    0

    私もあなたの3番目の解決策を好みますが、f.writeを使用する必要はなく、ユーザーが作成した関数/呼び出し可能オブジェクトならどれでも使用できます。したがって、次の変更は簡単になります。オブジェクトを使用する場合は、その中にターゲットファイルを非表示にして、ファイルや改行などの構文上のノイズを取り除くこともできます。

    あまりにも悪い印刷は、Python 2.xのステートメントであり、Python 3.xの印刷は、ユーザー定義の何かによって単純にオーバーロードされる可能性があります。

    于 2009-11-05T01:15:51.100 に答える
    0

    Pythonには、電子メールとhttpヘッダーの両方を簡単に準拠した方法で処理するためのモジュールがあります。すでに解決済みの問題を再度解決するのではなく、それらを使用することをお勧めします。

    于 2009-11-05T10:34:18.177 に答える