![]() |
Con Python 3.14 arriva una novità importante: i t-string, una nuova sintassi simile agli f-string, ma progettata per migliorare la sicurezza quando si compongono testi che includono variabili, come query SQL, HTML, comandi esterni, ecc.
Gli f-string sono perfetti per la formattazione immediata:
name = "Alice"
print(f"Hello {name}")
Ma quando il contenuto arriva da fuori (input utente, database, API…), inserirlo direttamente nel testo può essere pericoloso (injection).
I t-string servono proprio a questo: tenere separati testo e valori, così le librerie possono trattare gli input come dati sicuri.
🔍 Cosa cambia tra f-string e t-string?
✔ f-string
- producono subito una stringa (
str) - interpolano le variabili direttamente
- non proteggono da injection
✔ t-string
- producono un oggetto Template, non una stringa
- separano:
- le parti di testo statico (
strings) - i punti di interpolazione (
interpolations) - non interpolano da sole
- permettono alle librerie di sostituire i valori in modo sicuro (es. escaping, parametrizzazione, sanitizzazione)
🧠 Un esempio semplice: dal f-string al t-string
🔵 f-string (risultato immediato)
name = "Alice"
print(f"Hello {name}")
Hello Alice🟢 t-string (stesso scopo, ma più sicuro)
name = "Alice"
tmpl = t"Hello {name}"
Ma qui succede una cosa importante:tmpl non è una stringa!
È un Template.
Per vedere com’è fatto:
print(tmpl.strings) # ['Hello ', '']
print(tmpl.interpolations) # ['name']
Questo mostra la struttura del template:
- prima parte di testo:
"Hello " - punto di interpolazione:
name - parte finale (vuota)
Ma quindi… come ottengo la stringa "Hello Alice"?
Dipende dal contesto in cui il template viene usato.
Python non fornisce un metodo .render(): è una scelta intenzionale. Sono le librerie (database, HTML, sanitizzatori...) che devono decidere come sostituire i valori in modo sicuro.
Per esempio, una libreria SQL potrebbe usare il template per generare una query parametrizzata:
query = t"SELECT * FROM users WHERE name = {name}"
db.execute(query, name=name) # sarà la libreria ad applicare l'interpolazione sicura
🔐 Perché i t-string migliorano la sicurezza?
Perché impediscono che i valori inseriti vengano trattati come codice.
Con un f-string, il contenuto viene inserito dentro la stringa:
f"SELECT * FROM users WHERE name = '{name}'"
Con un t-string, invece, la libreria vede:
- parte fissa:
SELECT * FROM users WHERE name = - parametro:
name
E può decidere di:
- eseguire escaping
- usare query parametrizzate
- rifiutare valori sospetti
- loggare separatamente la parte variabile
In pratica, il t-string rende difficile o impossibile un attacco di injection, perché il valore dell’utente non viene mai fuso nel testo.
📝 Riepilogo
| Scopo | f-string | t-string |
|---|---|---|
| Formattazione rapida | ✔️ | ➖ non è lo scopo |
| Produce una stringa subito | ✔️ | ❌ |
| Separa dati da testo | ❌ | ✔️ |
| Sicuro contro injection | ❌ | ✔️ |
| Usato in SQL, HTML, JSON, API | ❌ rischioso | ✔️ ideale |
🎯 Conclusione
Se vuoi stampare qualcosa o formattare testo semplice:
print(f"Hello {name}")
Se invece stai passando contenuti a sistemi esterni (database, comandi shell, API…):
tmpl = t"Hello {name}"
Il risultato finale non lo generi tu:
sarà la libreria che usa il template a sostituire i valori in modo sicuro, prevenendo l’injection.
E ricorda: le istanze di Template non sono stringhe 😉
Approfondimenti
- Python's new t-strings — https://davepeck.org/2025/04/11/pythons-new-t-strings/
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment
