f字符串中的星号(星号)是做什么的?

时间:2019-05-01 09:09:51

标签: python python-3.x string language-lawyer 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

1 个答案:

答案 0 :(得分:8)

f_expression有两种选择:用逗号分隔的or_expression列表(可选的是前面带有星号)或单个yield_expression。请注意,yield_expression不允许使用星号。

我认为这样做的目的是仅在至少有一个逗号的情况下才选择用逗号分隔的列表,但是语法实际上并没有这样说。我觉得最后的重复运算符应该是+而不是*

因此f"{*1}"将是语法错误,因为有一个星号,但没有逗号。 f"{*1,*2}"在语法上是有效的,但是由于1和2不可迭代而导致类型错误。 f"{*[1], *[2]}"有效,并且与f"{1,2}"相同。因此允许使用星号,因为它在元组中充当splat运算符,可以在f表达式中不加括号地编写该星号。

请注意,将or_expr用作*的操作数并不意味着必须在其中使用按位or运算符-只是意味着按位or运算符是操作符中的第一个运算符优先级-层次结构,可以作为*的操作数。因此,这只是设置前缀*与其他表达式的优先级。我相信or_expression始终被用作操作符,在语法中的任何地方(即在前缀*后跟表达式而不是参数名称的地方)都前缀*。 / p>