2015-10-13 10 views
15

タイトルが示すように、これらの2つのフラグの違いは何ですか?彼らは両方ともrepr()を使って値を文字列に変換しているようですね?Pythonの!rと%rの違いは何ですか?

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

Rの前に0が何をするん!このコード行でも 、?

+2

インデックス1で二番目の引数などを取る0「は0番目の位置引数を使用する」を意味し、0です - あなたは何度も位置引数の1以上を使用することを意味している場合、あなたはそれを必要としますPython 2.6をサポートする必要がある場合Python 2.7と3.xでは、 '' {} {} '' .format(...) 'は自動的に' '{0} {1} '' format(...)'として扱われます。 – lvc

+0

[Python文字列の書式化:%と.format]の重複している可能性があります(http://stackoverflow.com/questions/5082452/python-string-formatting-vs-format) –

答えて

21

%rは、str.format()の書式設定操作では有効なプレースホルダではありません。 old-style % string formattingでのみ動作します。実際にはオブジェクトをrepr()関数を通して表現に変換します。

str.format()では、!rは同等ですが、これは文字列にすべてformat codesを使用できるようになったことを意味します。通常str.format()は、オブジェクト自体に対してobject.__format__()メソッドを呼び出しますが、代わりに!rを使用すると、repr(object).__format__()が代わりに使用されます。

!sと(Python 3の)!aコンバータもあります。これらは最初にstr()ascii()関数を適用します。

先頭にある0は、そのスロットを満たすためにstr.format()メソッドの引数が使用されることを示します。あなたのケースでは、位置引数0"Hello"です。あなたもという名前引数を使用し、キーワード引数としてオブジェクトに渡すことができます。

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

あなたは、Python 2.6を使用していない限り、インデックスまたは名前のないスロットは自動的に番号が付けられているとして、あなたはこれを省略することができます。最初{}{}

+1

ありがとう、あなたが「このまた、すべてのフォーマットコードを文字列に使用できるようになりました。 –

+1

':'コロンの後のコードは 'object .__ format __()'メソッドに渡され、したがって型固有です。浮動小数点数は、文字列とは異なる書式コードを受け入れます。したがって、オブジェクトがfloatの場合は、 '!r'を追加するときとは異なる書式コードを使用します。 –

関連する問題