Python 3.6中使用元组的格式化字符串字面量

8

使用 str.format(),我可以使用元组访问参数:

>>> '{0}, {1}, {2}'.format('a', 'b', 'c')

'a, b, c'

或者
>>> t = ('a', 'b', 'c')
>>> '{0}, {1}, {2}'.format(*t)

'a, b, c'

但是使用带有前缀“f”(f-strings)的新格式化字符串字面值,我如何使用元组?

f'{0}, {1}, {2}'.(*t)  # doesn't work

1
你是什么意思 但是使用以'f'为前缀的新格式化字符串字面值如何使用元组?另外在你的第二个示例中,你需要解包元组。 - Mazdak
f-strings的使用很大程度上取决于特定的用例。给我们一个现实的例子,说明你正在尝试做什么,因为当前的问题在3.6和pre-3.6中最好都使用', '.join(t)来解决。 - Markus Meskanen
1
'...'.format('a', 'b', 'c') 是一个方法调用,你使用了3个参数进行调用。在第一个例子中,你没有传入元组。而在第二个例子中,你使用了*args的调用语法;str.format()仍然接收到了3个单独的参数,并不知道你使用了元组来提供这些参数。 - Martijn Pieters
@Kasramvd 我的意思是 f'{0}, {1}, {2}'.(*t) 不起作用。 - Trimax
1个回答

11
你的第一个str.format()调用是一个带有3个参数的常规方法调用,其中没有涉及元组。你的第二个调用使用了*展开调用语法;str.format()调用接收3个单独的参数,它不关心这些参数来自元组。
使用f格式化字符串不使用方法调用,因此你不能使用任何一种技术。相反,f'..'格式化字符串中的每个插槽都被执行为常规Python表达式。
你需要直接从元组中提取值:
f'{t[0]}, {t[1]}, {t[2]}'

或者,您可以先将元组扩展为新的本地变量:
a, b, c = t
f'{a}, {b}, {c}'

您可以继续使用str.format()来进行字符串格式化,不一定需要使用f'..'的格式化字符串,这是语言的一个新的附加功能,而不是替代str.format()的功能。根据PEP 498 -- Literal String Interpolation,本提案并不打算移除或废弃任何现有的字符串格式化机制。请注意保留HTML标签。

2
f'数值:{str(t)[1:-2]}'。胜利! 但说真的,基于使用情景,新的方法可能会突然出现。我认为这个问题不可能被回答得太笼统。 - Markus Meskanen
1
str.format()在Python 3.6中不会被弃用? - Trimax
不,我非常确定在Python 3中它永远不会消失。@Trimax - Markus Meskanen
1
@Trimax:不,完全不是。格式化字符串是一种附加功能,而不是替代品。 - Martijn Pieters
3
@MarkusMeskanen:这仍然包括引号。为什么不使用 ', '.join(t) - Martijn Pieters
确实,这也是我在原问题的评论中提出的建议!@MartijnPieters 我想表达的观点是,可能没有一种一对一的方法将.format()转换为f-strings,但会发现完全不同的方法...有时.format()仍然是最好的选择。 - Markus Meskanen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接