36

とで出力を作成するスクリプトがsys.stdout.write()ありsys.stderr.write()ます。最近、スクリプトの他の側面についていくつか質問を投稿しましたが、回答を投稿する人が好むように見えることに気付きましたprint('some text', file=sys.stdout)。出力に関する私の主な関心事は、ファイルに、または別のプログラムへの入力として、シェルによってパイプされる可能性があることです。print()誰かがとの違い、sys.stdout.writeそれぞれを使用する必要がある場合、およびそれらの規則の理論的根拠を説明(または既存の説明に私を導く)できますか?

4

1 に答える 1

53

「誰かがprint()とsys.stdout.writeの違い、それぞれを使用する必要がある場合、およびそれらの規則の理論的根拠を説明(または既存の説明に誘導)できますか? 」

Python3のprint()関数に関して耳にする沈黙は、実際には1つの違い、つまり使用法しかないためだと思います。PEP-3105を引用させてください:[ 1 ]

の署名print()は次のとおりです。

def print(* args、sep =''、end ='\ n'、file = None)

次のような呼び出し:

print(a、b、c、file = sys.stderr)

今日と同等になります:

印刷>>sys.stderr、a、b、c

オプションのsep引数とend引数は、それぞれ引数の間に何を出力するかを指定します。

ソフトスペース機能(最初のアイテムの前にスペースを挿入するかどうかを印刷に指示するために現在使用されているファイルの半秘密属性)は削除されます。したがって、今日の直訳はありません。

「a」を印刷、印刷

「a」と改行の間にスペースは印刷されません。

したがって、2005年のGuido van Rossumの問題に関する議論を引用すると[ 1 ]:アイテム間にスペースを入れたくないと判断すると、印刷の使いやすさには明確な非線形性があります。を使用するように切り替えるかsys.stdout.write()、すべてのアイテムを文字列に収集する必要があります。これは単純な変換ではありません。この単純な例では、コンマの前のスペースを取り除くために何が必要かを検討してください。

print "x =", x, ", y =", y, ", z =", z

組み込み関数の場合、スペースを挿入せずに改行を追加せずに同様のことを行う組み込みコンパニオン関数を持つことは論理的なことです(またはその動作を制御するためのキーワードパラメーターを追加しますが、私は2番目の方が好きです働き); しかし、現在の状態で印刷するだけでは、次のようなものに切り替える必要があります

print "x = " + str(x) + ", y = " + str(x) + ", z = " + str(z)

また

print "x = %s, y = %s, z = %s" % (x, y, z)

どちらも非常に魅力的ではありません。(そして、スペースは大したことではないと私に言わないでください。この例ではそうではありませんが、他の状況ではあります。)


日曜日の朝、思い出の小道を下るのに良い質問です。なぜこの明らかな冗長性?より高レベルのコードを書く方がPython的に正しいからです。

Pythonの7番目の禅:「読みやすさのカウント」

于 2012-08-26T10:45:31.440 に答える