formatage de chaine avec python ******************************* Formattage des chaînes de caractères avec % =========================================== L’opérateur % fonctionne en Python comme la fonction sprintf de C. Bien sûr si vous ne connaissez pas C, ça ne vous aide pas. Pour faire simple, vous définissez un template ou format et des valeurs qui seront interprétées. Dans cet exemple, le template contient deux spécifications de conversion “%s” signifie “insérer une chaîne de caractère ici” et “%i” signifie “convertir un integer en string et l’insérer ici”. “%s” est particulièrement utile car il utilise la fonction standard str() pour convertir un objet en une chaîne de caractères. Les valeurs proposées doivent correspondrent au template, on a deux valeurs ici, un tuple. .. code-block:: bash name = 'David' messages = 3 text = ('Hello %s, you have %i messages' % (name, messages)) print text Ce qui donne : .. code-block:: bash Hello David, you have 3 messages Les détails sont dans la Python Library Reference, section 2.3.6.2, “String Formatting Operations”. Mettez cette page en favoris ! Si vous ne l’avez pas encore fait, allez sur python.org, téléchargez la documentation en HTML (dans un .zip ou une archive), et installez la sur votre machine. Il n’y a rien de mieux que d’avoir la ressource de référence à portée de clavier. Formattage des chaînes de caractères avancé Pourquoi est-ce qu’il y a autant de personnes qui ne réalisent pas qu’il y a d’autres façons de formater les chaînes de caractères qui peuvent s’avérer plus puissantes ? Avec des noms grâce à un dictionnaire : .. code-block:: bash values = {'name': name, 'messages': messages} print ('Hello %(name)s, you have %(messages)i ' 'messages' % values) Ici on a spécifié les noms des valeurs interprétées, qui constituent les clés du dictionnaire. Vous trouvez qu’il y a de la redondance ? Les noms “name” et “messages” sont déjà définis localement. On peut en tirer parti. En utilisant les variables locales : .. code-block:: bash print ('Hello %(name)s, you have %(messages)i ' 'messages' % locals()) La fonction locals() retourne un dictionnaire de toutes les variables locales disponibles. C’est très puissant. Grâce à ça, vous pouvez formater toutes les chaînes de caractères que vous voulez sans avoir à vous soucier de la correspondance positionnelle avec les valeurs soumises en argument. Mais le pouvoir peut être dangereux. (“With great power comes great responsibility.”) Si vous utilisez locals() avec un template issu d’une ressource externe, vous exposez l’intégralité de votre espace de noms local. C’est une chose à garder en tête. Pour examiner votre espace de nom local : .. code-block:: bash from pprint import pprint pprint(locals()) pprint est un module très utile. Si vous ne le connaissiez pas déjà, essayez de jouer avec. Ça rend le debugging des données structurées beaucoup plus simple ! Formattage des chaînes de caractères avancé L’espace de nom des attributs d’une instance d’objet est simplement un dictionnaire, self.__dict__. En utilisant l’espace de nom d’une instance : .. code-block:: bash print ("We found %(error_count)d errors" % self.__dict__) Equivalent à, mais moins flexible que : .. code-block:: bash print ("We found %d errors" % self.error_count) .. note:: Les attributs d’une classe sont dans le __dict__ de la classe. Les espaces de noms sont hérités et constituent donc des dictionnaires chaînés.