web-dev-qa-db-fra.com

Que fait une étoile (astérisque) en f-string?

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
17

Il existe deux alternatives pour f_expression: une liste séparée par des virgules de or_expressions, é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).

9
sepp2k