Python : fstrings
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
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}")
- 2022-03-11
print(f"{today:%Y}")
- 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"
- Center text:
print(f"{text:^15}")
- ' hello world '
number = 1234567890
- Set separator
print(f"{number:,}")
- 1,234,567,890
number = 123
- Add leading zeros
print(f"{number:08}")
- 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}}")
- '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.