web-dev-qa-db-ja.com

Pythonの!rと%rの違いは何ですか?

タイトルにあるように、これら2つのフラグの違いは何ですか?彼らは両方ともrepr()を使用して値を文字列に変換するようです?また、次のコード行では:

"{0!r:20}".format("Hello")  

!rの前の0は何をしますか?

30
b_pcakes

_%r_は、str.format()フォーマット操作の有効なプレースホルダーではありません。 古いスタイルの_%_文字列のフォーマット でのみ機能します。実際、repr()関数を介してオブジェクトを表現に変換します。

str.format()では、_!r_は同等ですが、これは、文字列にすべての 形式コード を使用できることを意味します。通常、str.format()はオブジェクト自体でobject.__format__()メソッドを呼び出しますが、_!r_を使用すると、代わりにrepr(object).__format__()が使用されます。

_!s_および(Python 3)_!a_コンバーターもあります。これらはstr()および ascii() 最初に機能します。

前の_0_は、str.format()メソッドへの引数がそのスロットを埋めるために使用されることを示します。あなたの場合、位置引数_0_は_"Hello"_です。 named引数も使用でき、キーワード引数としてオブジェクトを渡すことができます。

_"{greeting!r:20}".format(greeting="Hello")  
_

Python 2.6を使用している場合を除き、インデックスまたは名前のないスロットは自動的に番号が付けられるため、これを省略できます。最初の_{}_は_0_、2番目の_{}_は、インデックス_1_などで2番目の引数を取ります。

52
Martijn Pieters