如何将 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()
的一个元组的各个元素,而不是试图引用第二个参数。
简而言之,为什么会出现以下错误?
>>> 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()
的一个元组的各个元素,而不是试图引用第二个参数。