Python : fstrings

De Justine's wiki
Aller à la navigation Aller à la recherche

Le formatage de string, méthode Python3

https://realpython.com/python-f-strings/

On peut désormais se débarrasser des anciennes syntaxes :

print("{}".format(var))
print("%s"%var)

On peut appeller des fonctions :

>>> def texter():
...     return "This is a sample text"
... 
>>> print(f"{texter()}")
This is a sample text

... ainsi que des expressions logiques :

>>> def texter():
...     return "This is a sample text"
... 
>>> print(f"{texter()}")
This is a sample text

...voire séparer un print sur plusieurs lignes (ne pas oublier le f devant chaque expression):

>>> print(f"First "
... f"Second "
... f"Third")
First Second Third

...ou même écrire sur plusieurs lignes:

>>> print(f"""
... Les sanglots longs
... Des violons
... De l'automne"""
... 
... )

Les sanglots longs
Des violons
De l'automne

Quelques détails

Quotes

Tous les types de quotes fonctionnent de façon normale :

>>> print(f"hello")
hello
>>> print(f'Hi')
Hi
>>> print(f'''Ahoy''')
Ahoy

Dictionnaires

Attention avec les dictionnaires : il vaut mieux garder l'habitude d'écrire les dictionnaires en simples quotes, les strings en double :

>>> comedian = {'name': 'Eric Idle', 'age': 74}
>>> f"The comedian is {comedian['name']}, aged {comedian['age']}."
The comedian is Eric Idle, aged 74.

Cela fonctionne.

Cependant :

>>> comedian = {'name': 'Eric Idle', 'age': 74}
>>> f'The comedian is {comedian['name']}, aged {comedian['age']}.'
  File "<stdin>", line 1
    f'The comedian is {comedian['name']}, aged {comedian['age']}.'
                                    ^
SyntaxError: invalid syntax

Renvoie une erreur. Les simples quotes du dictionnaire viennent refermer celles de la chaîne de caractères.

Accolades

Pour faire apparaître une accolade, il faut la doubler :

>>> f"{{74}}"
'{74}'
>>> f"{{{74}}}"
'{74}'
>>> f"{{{{74}}}}"
'{{74}}'

Backslash & commentaires

On peut utiliser des backslashs pour échapper une partie de la chaîne, mais on ne peut les utiliser dans l'expression logique en elle-même :

>>> f"{\"Eric Idle\"}"
  File "<stdin>", line 1
    f"{\"Eric Idle\"}"
                      ^
SyntaxError: f-string expression part cannot include a backslash

De la même façon, attention aux commentaires dans les expressions :

>>> f"Eric is {2 * 37 #Oh my!}."
  File "<stdin>", line 1
    f"Eric is {2 * 37 #Oh my!}."
                                ^
SyntaxError: f-string expression part cannot include '#'

Un peu plus loin

Source

On peut cependant aller plus loin avec les fstrings.

Elles comportent des fonctionnalités de "sucre syntaxique" (beurk).

Format de dates

Elles peuvent notamment servir à formater des dates à la façon de datetime.strftime: <source lang="python"> import datetime today = datetime.datetime.today() print(f"{today:%Y-%m-%d}")

  1. 2022-03-11

print(f"{today:%Y}")

  1. 2022

</source>

Autres formatages

Elles ont même leur propre mini-langage de formatage (wahou), qu'on peut s'ennuyer à apprendre et à ne jamais utiliser, même si certaines features semblent plutôt utiles (mais restent faisables par d'autres moyens). format_spec  ::= [[fill]align][sign][#][0][width][grouping_option][.precision][type] fill  ::= <any character> align  ::= "<" | ">" | "=" | "^" sign  ::= "+" | "-" | " " width  ::= digit+ grouping_option ::= "_" | "," precision  ::= digit+ type  ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" <source lang="python"> text = "hello world"

  1. Center text:

print(f"{text:^15}")

  1. ' hello world '

number = 1234567890

  1. Set separator

print(f"{number:,}")

  1. 1,234,567,890

number = 123

  1. Add leading zeros

print(f"{number:08}")

  1. 00000123

</source>

Imbrication

On peut même les imbriquer, ce qui pour le coup peut s'avérer utile. <source lang="python"> import decimal width = 8 precision = 3 value = decimal.Decimal("42.12345") print(f"output: {value:{width}.{precision}}")

  1. 'output: 42.1'

</source>

Pensée personnelle

Je peux, d'un côté, comprendre pourquoi les fstrings ont été si décriées. Elles contiennent beaucoup de sucre (syntaxique), ce qui va à l'encontre de la philosophie pythonnienne de "Une seule façon de faire les choses". Cela dit, pour l'intégration d'une variable dans une chaîne de caractères, je préfère largement utiliser des fstrings qu'un .format illisible : les fstrings rendent les expressions lisibles et simples.