Dans le document python 2.4.3. Littéraux de chaîne formatés , il semble possible d'écrire une étoile suivie d'une expression dans le {}
, mais je ne trouve pas comment l'utiliser.
Qu'est-ce que c'est et comment je peux l'utiliser? Est-ce documenté quelque part?
Pour être exact, il s'agit de "*" or_expr
partie des éléments suivants 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
Je l'ai essayé dans REPL, mais cela provoque une erreur.
>>> l = [1, 2, 3]
>>> f"{l}"
'[1, 2, 3]'
>>> f"{*l}"
File "<stdin>", line 1
SyntaxError: can't use starred expression here
Il existe deux alternatives pour f_expression
: une liste séparée par des virgules de or_expression
s, éventuellement précédé d'astérisques, ou d'un seul yield_expression
. Noter la yield_expression
n'autorise pas l'astérisque.
Je suppose que l'intention était que l'alternative de liste séparée par des virgules ne soit choisie que lorsqu'il y a au moins une virgule, mais la grammaire ne le dit pas réellement. Je pense que l'opérateur de répétition à la fin aurait dû être un +
à la place d'un *
.
Alors f"{*1}"
serait une erreur de syntaxe car il y a un astérisque, mais pas de virgule. f"{*1,*2}"
est syntaxiquement valide, mais une erreur de type car 1 et 2 ne sont pas itérables. f"{*[1], *[2]}"
est valide et agit de la même manière que f"{1,2}"
. L'astérisque est donc autorisé car il agit comme l'opérateur splat dans les tuples, qui peut être écrit sans parenthèses dans les expressions f.
Notez que l'utilisation de or_expr
comme l'opérande de *
ne signifie pas qu'un opérateur ou au niveau du bit doit y être utilisé - cela signifie simplement que l'opérateur ou au niveau du bit est le premier opérateur de la hiérarchie de priorité qui serait autorisé comme opérande à *
. Il s'agit donc simplement de définir la priorité du préfixe *
par rapport à d'autres expressions. Je crois or_expression
est toujours utilisé comme opérande pour préfixer *
partout dans la grammaire (c'est-à-dire partout où le préfixe *
est suivi d'une expression par opposition à un nom de paramètre).