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

Tak*_*shi 15 python string language-lawyer python-3.x f-string

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

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

确切地说,这是关于"*" or_expr以下BNF的一部分。

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

sep*_*p2k 8

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

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

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

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