HOWTO · Python

Équivalent de String Builder en Python

Ce tutoriel montre l'équivalent de la classe StringBuilder en Python

Sur cette page

Python ne possède pas de classe intégrée StringBuilder, contrairement à certains autres langages. Choisissez plutôt une méthode de construction de chaînes selon la provenance des éléments : utilisez str.join() pour un itérable de chaînes, + pour quelques éléments fixes et io.StringIO lorsque le code écrit les éléments au fur et à mesure. Les f-strings servent à formater des valeurs dans une chaîne ; elles ne constituent pas un tampon général pour une séquence arbitraire.

Les chaînes Python sont immuables : une opération qui en modifie le contenu produit une nouvelle valeur, au lieu de modifier la chaîne d’origine sur place. Cela aide à comprendre pourquoi accumuler sans cesse un résultat qui grandit peut être une mauvaise pratique générale, mais ne signifie pas que chaque utilisation de + est lente. Pour une expression courte et fixe, la concaténation est claire et pratique.

Ce que signifie l’équivalent de StringBuilder en Python

Une API de type StringBuilder est utile lorsqu’un programme doit assembler du texte à partir de nombreux éléments. Python fournit des outils standard pour accomplir cette tâche générale, mais aucune classe unique ne remplace toutes les méthodes. La forme des données d’entrée et la façon dont le texte est produit déterminent l’outil qui rend le code le plus lisible.

Construire des chaînes à partir d’éléments avec str.join()

Appliquez join() à la chaîne séparatrice lorsque vous disposez déjà d’un itérable de chaînes. Le séparateur apparaît entre les éléments adjacents, sans en ajouter au début ni à la fin. Par exemple, " / ".join(parts) assemble les valeurs en les séparant par une barre oblique entourée d’espaces. Chaque élément doit être une chaîne ; convertissez les autres types avant l’assemblage, ou utilisez le formatage si les valeurs doivent être intégrées à un message plus large.

Exécutez cet exemple. Le code et le chemin affiché restent en anglais :

parts = ["docs", "python", "strings"]
path = " / ".join(parts)
print(path)
docs / python / strings

join() est un choix pratique par défaut pour assembler une collection de chaînes connues. Le séparateur est explicite et il n’est pas nécessaire d’écrire une boucle qui agrandit le résultat à chaque tour. Cette méthode ne garantit pas d’être toujours plus rapide ; choisissez-la parce que ses entrées et son objectif correspondent à la tâche.

Quand la concaténation avec + convient

Utilisez + lorsque le nombre d’éléments est faible et fixe, par exemple pour combiner une salutation et un nom ou ajouter une ponctuation à une étiquette. L’expression rend les éléments visibles et est souvent plus simple que de créer une collection dans le seul but de les assembler.

Pour une séquence produite au fil de nombreuses itérations, affecter plusieurs fois result = result + piece peut créer de nouvelles valeurs de chaîne successives et entraîner du travail inutile. Il est préférable de rassembler les chaînes puis de les joindre en une fois, ou d’utiliser StringIO lorsque chaque élément s’écrit naturellement au moment où il est produit. Les performances réelles dépendent du programme et de l’implémentation de Python ; évitez donc de choisir une méthode sur la base d’un classement universel non étayé.

Utiliser io.StringIO pour écrire progressivement

Lorsque le code génère du texte par étapes, io.StringIO fournit un flux de texte en mémoire doté d’une méthode write(). Importez-le depuis io, écrivez chaque élément de chaîne, puis appelez getvalue() pour obtenir la chaîne accumulée. Cette approche peut rendre le code orienté vers la production de texte plus lisible lorsque les éléments proviennent de branches ou d’étapes différentes. Chaque argument de write() doit être une chaîne. Utilisez un gestionnaire de contexte si cela clarifie la durée de vie du flux ; si vous avez besoin du résultat complet ensuite, appelez getvalue() avant de quitter ce contexte.

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

from io import StringIO

with StringIO() as output:
    output.write("Hello")
    output.write(", ")
    output.write("Python")
    message = output.getvalue()

print(message)
Hello, Python

Le code et le texte affiché par cet exemple restent en anglais. Un wrapper personnalisé est généralement inutile ; si l’application en a besoin, stockez son tampon dans chaque instance afin que plusieurs constructeurs ne partagent pas leur état.

Formater des valeurs avec les f-strings

Utilisez une f-string pour formater des valeurs dans une chaîne. Les expressions entre accolades sont évaluées et converties pour l’affichage, ce qui rend un message court plus lisible :

Le code et les libellés ou sorties affichés dans cette section restent en anglais.

name = "Ada"
count = 3
message = f"{name} has {count} tasks."
print(message)

Le code et le message affiché restent en anglais. Les f-strings servent à interpoler des valeurs, pas à ajouter progressivement les éléments d’une collection arbitraire. Si les valeurs forment une collection, préparez des chaînes et utilisez join() ; si le texte s’écrit par étapes, envisagez StringIO. Cette distinction sépare le formatage de l’accumulation.

Choisir la bonne méthode de construction de chaînes

  • Choisissez str.join() si vous avez un itérable de chaînes et souhaitez les séparer par un délimiteur.
  • Choisissez + pour assembler un petit nombre d’éléments fixes clairement visibles.
  • Choisissez io.StringIO lorsque le texte s’écrit progressivement au moyen d’une interface semblable à un flux.
  • Choisissez une f-string pour insérer quelques valeurs dans un message ou une autre chaîne formatée.

Il n’existe pas d’équivalent Python unique à StringBuilder adapté à toutes les situations. Choisissez la méthode selon la façon dont les éléments sont fournis et convertissez les valeurs en chaînes lorsque l’opération choisie exige des chaînes en entrée. Ces méthodes permettent de construire du texte sans s’appuyer sur des affirmations générales selon lesquelles l’une serait toujours la plus rapide.