python-3.x 星星(星号)在f字符串中做什么?

n1bvdmb6  于 2023-03-09  发布在  Python
关注(0)|答案(2)|浏览(135)

在python文档2.4.3. Formatted string literals中,似乎可以在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

我在REPL中试过了,但是它导致了一个错误。

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

cbeh67ev1#

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在语法中的任何地方(也就是说,在前缀*后面跟有表达式而不是参数名的任何地方)都被一致地用作前缀*的操作数。

7hiiyaii

7hiiyaii2#

你可以把它转换成字符串:

f"{str(*l)}"

相关问题