Les nouveaux `t-strings` de Python
(davepeck.org)- Les t-strings sont une nouvelle fonctionnalité de traitement de chaînes sûre et flexible introduite dans Python 3.14
- Contrairement aux f-strings existantes, une t-string renvoie un objet
Templateplutôt qu’une chaîne, ce qui permet un traitement sûr sans rendu automatique - Les t-strings reposent sur une structure permettant d’échapper en toute sécurité des entrées dynamiques comme en HTML ou en SQL
- Le concept est similaire aux tagged templates de JavaScript, avec des possibilités d’extension pour diverses transformations et traitements
- Si l’écosystème des outils de développement Python prend bien en charge cette fonctionnalité, elle pourrait profondément faire évoluer le traitement des chaînes orienté web/sécurité
Nouvelle fonctionnalité de Python : les t-strings (Template Strings)
- À partir de Python 3.14, les Template strings (t-strings) utilisées avec la syntaxe
t"..."sont introduites comme fonctionnalité officielle - Contrairement aux f-strings existantes, une t-string est évaluée non pas immédiatement en chaîne, mais en objet
string.templatelib.Template - Cet objet nécessite une étape de transformation distincte avant affichage, ce qui permet un traitement et une conversion sûrs des valeurs dynamiques
Pourquoi les f-strings peuvent-elles être risquées ?
- Comme une f-string est évaluée immédiatement en chaîne, du code incluant des entrées utilisateur peut provoquer une injection SQL ou du XSS
- Exemple :
f"<div>{user_input}</div>"→ du code malveillant peut être injecté directement
- Exemple :
- Les t-strings retardent cette évaluation, de sorte qu’elles ne peuvent être utilisées qu’après un traitement explicite
Exemples d’utilisation des t-strings
-
Exemple de traitement avec échappement HTML :
evil = "<script>alert('bad')</script>" template = t"<p>{evil}</p>" safe = html(template) # safe vaut "<p><script>alert('bad')</script></p>" -
Des traitements plus complexes, comme l’insertion automatique d’attributs, sont également possibles :
attributes = {"src": "roquefort.jpg", "alt": "Yum"} template = t"<img {attributes} />" element = html(template) # résultat : "<img src='roquefort.jpg' alt='Yum' />"
Structure et API
-
L’objet
Templatefournit séparément le texte d’origine et les valeurs interpolées via les attributs.stringset.values -
L’attribut
interpolationspermet d’accéder jusqu’aux détails de formatage comme!s,:>8, etc. -
Il est aussi possible de parcourir l’objet pour traiter directement un état mêlant texte et valeurs
-
Création manuelle également possible :
from string.templatelib import Template, Interpolation template = Template( "Hello ", Interpolation(value="World", expression="name"), "!" )
Exemple amusant : un convertisseur en Pig Latin
-
Exemple qui parcourt le contenu d’un objet Template pour transformer les mots en Pig Latin :
def pig_latin(template: Template) -> str: ... name = "world" template = t"Hello {name}!" assert pig_latin(template) == "Hello orldway!"
Perspectives
- Les t-strings peuvent apporter sécurité et extensibilité au traitement des chaînes orienté web/sécurité
- On peut espérer que des outils comme
black,ruffet VS Code prendront en charge le formatage et la coloration des t-strings - Le mécanisme est proche des tagged templates familiers aux développeurs JavaScript, ce qui lui donne un fort potentiel d’adoption dans divers frameworks
Collaboration avec la communauté des développeurs
- Cette fonctionnalité a été finalisée grâce à la participation et à la collaboration de nombreux membres de la communauté Python
- Sont notamment mentionnés les échanges avec Jim, Paul, Koudai, Lysandros et Guido, parmi les personnes clés
- Le PEP 750 et son dépôt d’exemples sont disponibles sur GitHub
La fonctionnalité de t-strings de Python 3.14 constitue une avancée majeure qui assure à la fois la sécurité et l’extensibilité des chaînes, tout en dépassant les limites des f-strings existantes
2 commentaires
PEP 750 – Chaînes de modèle (
t-strings) approuvéesAvis Hacker News
Globalement, cette fonctionnalité est plutôt sympa. En gros, elle transforme un code comme
en
On peut se demander si ce sucre syntaxique apporte assez pour justifier la complexité d’une nouvelle fonctionnalité du langage. Je pense que oui dans ce cas, pour deux raisons
{}, et cela pourrait donner lieu à de bons cas d’usageJ’espère aussi que l’écosystème d’outils s’adaptera pour prendre en charge les t-strings. Par exemple, ce serait bien que black et ruff formatent le contenu des t-strings, et que vscode colore le contenu pour des types courants comme le HTML ou le SQL
sql”select * from {table}”aurait pu permettre cela, mais rien ne garantit non plus que ce qui est dans le template sera transformé en SQL valide par la fonction de transformation.t“give me {table} but only {columns}”pourrait être transformé en SQL valide après traitement du templatePourrait-on utiliser une syntaxe SQL aussi propre que celle-ci ?
Si la fonction
db.get()accepte les templates, alors oui. Ce serait la manière la plus propre d’utiliser du SQL que j’aie vue jusqu’iciPersonnellement, j’ai l’impression que cette fonctionnalité est trop centrée sur un problème très spécifique pour devenir une fonctionnalité générale. Python devient de plus en plus gros. Quand les gens demandent si Python est facile à apprendre et simple, il faut répondre « les bases, oui, mais apprendre l’ensemble du langage, non »
Grosse discussion (414 points, il y a 10 jours, 324 commentaires) lien
Plutôt sympa. Si on porte des fonctionnalités de JS, est-ce qu’on pourrait avoir ensuite le dépaquetage/destructuring des dictionnaires ?
Le simple fait d’avoir une nouvelle fonctionnalité x-string intégrée donne l’impression d’un « gadget ». Ce serait cool si on pouvait faire quelque chose comme
Zen of Python en 2025 :
Le formatage de chaînes en Python en 2025 :
Je ne comprends pas en quoi cela diffère du fait d’appliquer la fonction au template en l’appliquant à la variable dans une f-string. Donc, au lieu de faire :
pourquoi ne pas simplement faire ceci :
Ou bien avant de construire la f-string. Est-ce simplement pour éviter d’oublier l’étape d’assainissement/manipulation de chaîne et forcer son passage ?
Bonjour ! C’est moi qui ai écrit cet article :-)