星号(星号)在 f 弦中起什么作用?

What does a star (asterisk) do in f-string?

在 python 文档 2.4.3. Formatted string literals 中,似乎可以在 f 字符串的 {} 中写一个星号后跟一个表达式,但我找不到如何使用它。

那是什么以及如何使用它?它在某处记录了吗?

准确的说,这是关于下面BNF"*" or_expr部分。

f_string          ::=  (literal_char | "{{" | "}}" | replacement_field)*
replacement_field ::=  "{" f_expression ["!" conversion] [":" format_spec] "}"
f_expression      ::=  (conditional_expression | "*" or_expr)
                         ("," conditional_expression | "," "*" or_expr)* [","]
                       | yield_expression

我在 REPL 中尝试过,但它会导致错误。

>>> l = [1, 2, 3]
>>> f"{l}"
'[1, 2, 3]'
>>> f"{*l}"
  File "<stdin>", line 1
SyntaxError: can't use starred expression here

f_expression 有两种选择:or_expr 的逗号分隔列表,可选地以星号开头,或单个 yield_expression。请注意 yield_expression 不允许使用星号。

我假设其意图是只有在至少有一个逗号时才会选择逗号分隔的列表选项,但语法实际上并没有这么说。我觉得最后的重复运算符应该是 + 而不是 *.

所以 f"{*1}" 会是一个语法错误,因为有一个星号,但没有逗号。 f"{*1,*2}" 在语法上是有效的,但是类型错误,因为 1 和 2 不可迭代。 f"{*[1], *[2]}" 有效且作用与 f"{1,2}" 相同。所以星号是允许的,因为它在元组中充当 splat 运算符,可以在 f 表达式中不带括号。

请注意,使用 or_expr 作为 * 的操作数并不意味着必须在那里使用按位或运算符 - 它只是意味着按位或运算符是第一个运算符在优先级层次结构中,允许作为 * 的操作数。所以它只是关于设置前缀 * 相对于其他表达式的优先级。我相信 or_expr 一直被用作操作数,在语法中的任何地方为 * 添加前缀(也就是说,前缀 * 后跟表达式而不是参数名称的任何地方)。