以元组为参数的新样式格式

时间:2013-03-03 02:50:55

标签: python string formatting

为什么我不能使用元组作为新样式格式化的参数(“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.

3 个答案:

答案 0 :(得分:49)

旧的格式化方法使用了二元运算符%。就其性质而言,它只能接受两个论点。新的格式化方法使用方法。方法可以采用任意数量的参数。

因为你有时需要传递多个东西进行格式化,并且一直都有一个项目创建元组有些笨拙,旧式的方式出现了一个hack:如果你把它作为一个元组传递,它将使用作为要格式化的东西的元组的内容。如果你传递的不是元组,它将使用它作为格式化的唯一东西。

新方法不需要这样的黑客:因为它是一种方法,它可以采用任意数量的参数。因此,需要将多个要格式化的内容作为单独的参数传递。幸运的是,您可以使用*

将元组解压缩为参数
print("First item: {:d}, second item: {:d} and third item: {:d}.".format(*tuple))

答案 1 :(得分:18)

正如icktoofay解释的那样,在旧的格式化方式中,如果你传入一个元组,Python会自动解压缩它。

但是,您不能使用str.format方法的元组,因为Python认为您只传入一个参数。您必须使用*运算符解压缩元组,以将每个元素作为单独的参数传递。

>>> 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 - 不要对变量使用内置名称,因为您将覆盖它们,这可能会导致问题进入轨道。

答案 2 :(得分:1)

如果手动索引大括号内的元组,实际上可以使用元组作为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.

我发现这不如*方法那么明确。