31

新しいスタイル ("string".format()) でフォーマッタの引数としてタプルを使用できないのはなぜですか? 古いスタイル ("string" %) で問題なく動作しますか?

このコードは機能します:

>>> 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.
4

3 に答える 3

51

書式設定の古い方法では、二項演算子%. その性質上、2 つの引数のみを受け入れることができます。フォーマットの新しい方法では、メソッドを使用します。メソッドは、任意の数の引数を取ることができます。

フォーマットするために複数のものを渡す必要がある場合があり、常に 1 つのアイテムでタプルを作成するのはやや不器用なので、古いスタイルの方法はハックを思いつきました: タプルとして渡す場合、それはの内容を使用しますフォーマットするものとしてタプル。タプル以外のものを渡すと、それをフォーマットする唯一のものとして使用します。

新しい方法はそのようなハックを必要としません: メソッドであるため、任意の数の引数を取ることができます。そのため、フォーマットする複数のものを個別の引数として渡す必要があります。幸いなことに、以下を使用してタプルを引数にアンパックできます*

print("First item: {:d}, second item: {:d} and third item: {:d}.".format(*tuple))
于 2013-03-03T02:55:03.937 に答える
18

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.

また、変数の名前を次のように変更したことに気付いたかもしれません。tuple変数にt組み込みの名前を使用しないでください。上書きすると、後で問題が発生する可能性があります。

于 2013-03-03T02:55:31.883 に答える