如何将 tuple1 if ... else tuple2 传递给 str.format?

How to pass tuple1 if ... else tuple2 to str.format?

简而言之,为什么会出现以下错误?

>>> yes = True
>>> 'no [{0}] yes [{1}]'.format((" ", "x") if yes else ("x", " "))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

我用的是python2.6.

使用 * 运算符,它接受一个可迭代的参数并将每个参数作为位置参数提供给函数:

In [3]: 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))
Out[3]: 'no [ ] yes [x]'

☞ 索引选项:

在格式字符串中访问参数项时,应使用索引调用值:

yes = True
print 'no [{0[0]}] yes [{0[1]}]'.format((" ", "x") if yes else ("x", " "))

{0[0]} 在格式字符串中等于 (" ", "x")[0] 在 tulple 的调用索引中

{0[1]} 在格式字符串中等于 (" ", "x")[1] 在 tulple 的调用索引中


* 运算符选项:

或者您可以使用 * 运算符来解包参数元组。

yes = True
print 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " "))

当调用 * 运算符时,如果 if 语句为 True

,则 'no [{0}] yes [{1}]'.format(*(" ", "x") if yes else ("x", " ")) 等于 'no [{0}] yes [{1}]'.format(" ", "x")

** 运算符选项(当你的 var 是 dict 时这是额外的方法):

yes = True
print 'no [{no}] yes [{yes}]'.format(**{"no":" ", "yes":"x"} if yes else {"no":"x", "yes":" "})

这里的问题是您只向 string.format() 提供了一个参数:一个元组。当您使用 {0}{1} 时,您指的是传递给 string.format() 的第 0 个和第一个参数。由于实际上没有第一个参数,因此会出现错误。

正如@Patrick Collins 所建议的,* 运算符之所以有效,是因为它将元组中的参数解包,将它们转换为单独的变量。就好像你调用了 string.format(" ", "x") (或者反过来)

@Tony Yang 建议的索引选项之所以有效,是因为它引用传递给 format() 的一个元组的各个元素,而不是试图引用第二个参数。