在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
2条答案
按热度按时间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
在语法中的任何地方(也就是说,在前缀*
后面跟有表达式而不是参数名的任何地方)都被一致地用作前缀*
的操作数。7hiiyaii2#
你可以把它转换成字符串: