新样式的格式与元组作为参数(New style formatting with tuple as a

2019-08-17 07:05发布

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

Answer 1:

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

既然你有时需要通过多件事情的格式,它是有些笨拙与一个项目创建的元组所有的时间,旧式的方式想出了一个黑客:如果你把它作为一个元组,它将使用的内容元组的事情格式化。 如果您通过它的其他东西比一个元组,它将使用作为格式的唯一的事。

新的办法并不需要这样的破解:因为它是一种方法,它可以采取任意数量的参数。 因此,多事情格式将需要作为单独的参数传递。 幸运的是,你可以使用解压元组到参数*

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


Answer 2:

作为icktoofay解释,在旧样式格式的,如果你在一个元组通过,巨蟒将自动解压。

但是,您不能使用带有一个元组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 -不变量使用内建的名字,你会覆盖它们,并可能导致走下赛场的问题。



Answer 3:

它实际上是可以使用一个元组作为参数传递给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.

我觉得这比不太清楚*的做法,虽然。



文章来源: New style formatting with tuple as argument