Introduction au formatage moderne
Depuis la version 2.6 de Python, la méthode str.format() a été introduite pour offrir une alternative puissante et flexible à l'ancien opérateur de formatage %. Cette approche repose sur l'utilisation d'accolades {} comme marqueurs de remplacement et de deux-points : pour définir des spécifications de format précises.
Gestion des arguments positionnels
La méthode format() accepte un nombre varible d'arguments. Contrairement à l'ancien formatage, l'ordre des paramètres peut être contrôlé explicitement via des index numériques, permettant même la réutilisation d'un même argument.
# Séquentiel (ordre par défaut)
print("{} et {}".format("Python", "Rust"))
# Indexation explicite
print("{0} et {1}".format("Python", "Rust"))
# Réutilisation et inversion d'index
print("{1} est plus récent que {0}, mais {0} est très mature".format("Python", "Rust"))
Arguments nommés et structures de données
Il est possible d'utiliser des arguments nommés (mots-clés), de déballer des dictionnaires, ou d'accéder directement aux éléments d'une liste ou aux attributs d'un objet via leurs index ou noms.
# Arguments nommés directs
print("Framework: {framework}, Version: {version}".format(framework="Django", version="4.2"))
# Déballage de dictionnaire
config = {"framework": "Flask", "version": "3.0"}
print("Framework: {framework}, Version: {version}".format(**config))
# Accès aux éléments d'une liste via l'index de l'argument
langages = ["Go", "Kotlin"]
print("Langage 1: {0[0]}, Langage 2: {0[1]}".format(langages))
# Accès aux attributs d'un objet
class Serveur:
def __init__(self, ip, port):
self.ip = ip
self.port = port
noeud = Serveur("192.168.1.50", 8080)
print("Connexion à {0.ip} sur le port {0.port}".format(noeud))
Formatage numérique avancé
Les spécificateurs de format permettent un contrôle granulaire sur l'affichage des nombres, incluant la précision décimale, l'alignement, le remplissage, les séparateurs de milliers et les conversions de base.
| Valeur | Spécificateur | Résultat | Description |
|---|---|---|---|
| 3.14159 | {:.2f} |
3.14 | Arrondi à deux décimales |
| 3.14159 | {:+.2f} |
+3.14 | Signe explicite, deux décimales |
| -1.0 | {:+.2f} |
-1.00 | Signe négatif conservé, deux décimales |
| 42 | {:0>5d} |
00042 | Remplissage avec des zéros à gauche (largeur 5) |
| 42 | {:*<5d} |
42*** | Remplissage avec des astérisques à droite |
| 1000000 | {:,} |
1,000,000 | Séparateur de milliers |
| 0.85 | {:.1%} |
85.0% | Formatage en pourcentage |
| 5000 | {:.2e} |
5.00e+03 | Notation sciantifique |
| 15 | {:>10d} |
15 | Alignement à droite (par défaut) |
| 15 | {:<10d} |
15 | Alignement à gauche |
| 15 | {:^10d} |
15 | Centrage |
| 255 | {:b} |
11111111 | Conversion en binaire |
| 255 | {:x} |
ff | Conversion en hexadécimal |
Les symboles <, > et ^ dictent respectivement l'alignement à gauche, à droite et au centre. Ils peuvent être précédés d'un caractère de remplissage personnalisé (un seul caractère autorisé, sinon l'espace est utilisé par défaut). Le signe + force l'affichage du signe pour les nombres positifs, tandis que les lettres b, d, o et x définissent les bases numérique (binaire, décimal, octal, hexadécimal).
Échappement des accolades
Puisque les accolades sont utilisées comme délimiteurs de formatage, il est nécessaire de les doubler pour afficher des accolades littérales dans la chaîne finale.
print("Le dictionnaire vide s'écrit {{}} et contient actuellement {0} élément".format(0))