2013-03-03 17 views
26

新しいスタイル( "string" .format())でフォーマッタの引数としてタプルを使用できないのはなぜですか?それは古いスタイル( "文字列"%)で正常に動作しますか?引数としてタプルを使用する新しいスタイルの書式化

このコードで動作します:

>>> tuple = (500000, 500, 5) 
... print "First item: %d, second item: %d and third item: %d." % tuple 

    First item: 500000, second item: 500 and third item: 5. 

そして、これにはないが:

>>> tuple = (500000, 500, 5) 
... print("First item: {:d}, second item: {:d} and third item: {:d}." 
...  .format(tuple)) 

    Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    ValueError: Unknown format code 'd' for object of type 'str' 

でも{R!}

>>> tuple = (500000, 500, 5) 
... print("First item: {!r}, second item: {!r} and third item: {!r}." 
...  .format(tuple)) 

    Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    IndexError: tuple index out of range 

と、それはその方法で動作しますが:

>>> print("First item: {!r}, second item: {!r} and third item: {!r}." 
...  .format(500000, 500, 50)) 

    First item: 500000, second item: 500 and third item: 5. 

答えて

45

古い形式の書式設定では、バイナリ演算子%が使用されていました。その性質上、2つの引数しか受け入れられません。新しい書式設定方法はメソッドを使用します。メソッドは任意の数の引数を取ることができます。

フォーマットするには複数のものを渡す必要があることがあるので、常に1つのアイテムでタプルを作成するのはやや面倒です。古いスタイルの方法ではハックが発生します。タプルとして渡すと、フォーマットするものとしてのタプルの内容。タプル以外のものを渡すと、それをフォーマットする唯一のものとして使用します。

新しい方法では、このようなハッキングは必要ありません。メソッドであるため、任意の数の引数を取ることができます。したがって、書式を設定する複数のものを別々の引数として渡す必要があります。幸いにも、あなたは*を使用して、引数にタプルを解凍することができます

print("First item: {:d}, second item: {:d} and third item: {:d}.".format(*tuple)) 
17

icktoofayが説明したように、あなたはタプルに渡された場合の書式設定の古いスタイルで、Pythonは自動的にそれを解凍します。

しかし、str.formatメソッドでタプルを使用することはできません。なぜなら、Pythonはあなたが1つの引数だけを渡していると考えているからです。 *演算子でタプルを展開して、個々の引数として各要素を渡す必要があります。変数のための組み込みの名前を使用しないでください、あなたがそれらを上書きすると、それはトラックダウンの問題を引き起こす可能性があるとして -

>>> t = (500000, 500, 5) 
>>> "First item: {:d}, second item: {:d} and third item: {:d}.".format(*t) 
First item: 500000, second item: 500 and third item: 5. 

また、あなたは私がtにごtuple変数の名前を変更し気づいているだろう。

+3

+1変数の名前を変更します。 –

+1

@Volatility私は{:d}は必要ないと思います。データを注文したい場合は{0} {1} {2} – GeoStoneMarten

+0

@GeoStoneMartenの中の{{d}}を使って簡単に{}を使うか、そこに10進数を入れたい(あなたのコードを読んでいる誰かのために) – Petzku

0

中括弧内の場合は、手動でインデックスタプルをformat()の引数としてタプルを使用することが実際に可能である:

>>> t = (500000, 500, 5) 
>>> print("First item: {0[0]:d}, second item: {0[1]:d} and third item: {0[2]:d}.".format(t)) 
First item: 500000, second item: 500 and third item: 5. 

でも、私は*アプローチよりも、これはそれほど明確見つけます。

関連する問題