T-strings y templatelib: interpolación estructurada

Publicado el: 22/10/2026
Tempo de leitura: 6 minutos
Código Python en una pantalla

Las t-strings son una función de Python 3.14 diseñada para representar texto interpolado como datos estructurados. Su sintaxis se parece a la de las f-strings, pero no produce inmediatamente una cadena final. En su lugar, devuelve un objeto de plantilla que mantiene separados el texto literal, los valores interpolados, las conversiones y las especificaciones de formato. Esta diferencia permite validar, escapar, transformar o auditar cada valor antes de generar la salida.

La funcionalidad está disponible mediante string.templatelib. Resulta útil cuando construir una cadena directamente haría perder información necesaria para una biblioteca. Algunos casos frecuentes son la generación segura de HTML, los logs estructurados, la internacionalización, los constructores de consultas y los lenguajes específicos de dominio.

Diferencias entre t-strings y f-strings

Una f-string evalúa sus expresiones y devuelve un str. Esto es práctico para mensajes sencillos, pero la estructura original desaparece. Después de ensamblar la cadena, ya no es posible distinguir de forma fiable qué parte era literal y qué parte procedía de una variable. Una t-string conserva esos límites.

nombre = "Ana"
edad = 28
plantilla = t"Usuario: {nombre}, edad: {edad}"

print(type(plantilla))
print(plantilla.strings)
print(plantilla.interpolations)

El atributo strings contiene los segmentos literales. El atributo interpolations reúne los valores insertados y sus metadatos. Un renderizador puede procesar cada componente según sus propias reglas.

Objetos Template e Interpolation

El módulo expone principalmente Template e Interpolation. Un Template representa la secuencia completa. Cada Interpolation almacena el valor evaluado, el texto de la expresión, una conversión opcional y la especificación de formato.

Por ejemplo, una interpolación como {precio:.2f} conserva tanto el valor como .2f. El renderizador puede respetar esa especificación, rechazarla o sustituirla por una política propia. Lo mismo ocurre con conversiones como !r.

Cómo recorrer una plantilla

Una plantilla puede recorrerse en el orden original. Durante la iteración aparecen cadenas literales y objetos de interpolación, lo que facilita crear renderizadores explícitos.

from string.templatelib import Interpolation

def renderizar(plantilla):
    partes = []
    for elemento in plantilla:
        if isinstance(elemento, Interpolation):
            partes.append(str(elemento.value))
        else:
            partes.append(elemento)
    return "".join(partes)

usuario = "Carlos"
print(renderizar(t"Hola, {usuario}!"))

Este ejemplo es deliberadamente simple. Un renderizador real podría escapar HTML, ocultar secretos, conservar tipos para telemetría o devolver una estructura distinta de una cadena.

HTML más seguro

Uno de los usos más interesantes es el escape dependiente del contexto. Insertar datos externos directamente en HTML puede crear vulnerabilidades. Con una t-string, el renderizador puede escapar solo los valores interpolados y conservar el marcado literal escrito por el desarrollador.

from html import escape
from string.templatelib import Interpolation

def html_seguro(plantilla):
    salida = []
    for elemento in plantilla:
        if isinstance(elemento, Interpolation):
            salida.append(escape(str(elemento.value)))
        else:
            salida.append(elemento)
    return "".join(salida)

comentario = "<script>alert('x')</script>"
pagina = html_seguro(t"<p>{comentario}</p>")

Las t-strings no vuelven segura una salida de manera automática. Proporcionan la estructura necesaria para implementar una política de seguridad. El renderizador sigue siendo responsable de aplicar el tratamiento correcto.

Logs estructurados

Un sistema de logging puede guardar por separado los nombres de las expresiones y sus valores, en lugar de convertir todo en texto. Esto mejora los filtros, las métricas, las alertas y las búsquedas.

def registrar(plantilla):
    campos = {}
    for interp in plantilla.interpolations:
        campos[interp.expression] = interp.value
    print({"mensaje": plantilla.strings, "campos": campos})

pedido_id = 845
estado = "pagado"
registrar(t"Pedido {pedido_id} quedó {estado}")

Los valores mantienen sus tipos. Una plataforma de observabilidad puede tratar un entero como entero sin extraerlo de una frase. También puede ocultar campos sensibles según el nombre de la expresión o el tipo del valor.

Consultas y comandos

Las t-strings pueden utilizarse como entrada para bibliotecas que construyen consultas o comandos. Un procesador puede convertir los valores interpolados en placeholders, mantener los parámetros separados, aceptar solo tipos permitidos y rechazar expresiones inseguras.

Sin embargo, una t-string por sí sola no evita SQL injection ni command injection. La biblioteca consumidora debe implementar parametrización real y validación específica para el contexto. La ventaja es que el texto literal y los valores están separados.

Conversiones y formato

Las t-strings conservan conversion y format_spec, pero el renderizador decide si debe aplicarlos. La función convert() puede procesar conversiones compatibles y format() puede aplicar la especificación de formato.

from string.templatelib import Interpolation, convert

def renderizar_formato(plantilla):
    resultado = []
    for elemento in plantilla:
        if not isinstance(elemento, Interpolation):
            resultado.append(elemento)
            continue
        valor = convert(elemento.value, elemento.conversion)
        resultado.append(format(valor, elemento.format_spec))
    return "".join(resultado)

Un renderizador robusto debe tratar especificaciones vacías, conversiones ausentes, formatos inválidos y objetos personalizados con cuidado.

Internacionalización

Conservar los límites de interpolación puede ayudar a sistemas de traducción. En vez de traducir una frase ya ensamblada, una herramienta puede mantener placeholders estables y aplicar después reglas locales para números, fechas y monedas.

Esto no reemplaza un sistema completo de internacionalización. Las reglas de plural, género gramatical, selección regional y catálogos de mensajes siguen necesitando herramientas específicas. Las t-strings ofrecen una entrada estructurada útil para esos sistemas.

Cuándo conviene usarlas

Usa t-strings cuando la estructura de la interpolación siga siendo importante después de evaluar la expresión. Son adecuadas para motores de plantillas, logging estructurado, generación segura de marcado, DSL, localización y bibliotecas que inspeccionan o validan valores. Para un mensaje sencillo mostrado en consola, una f-string sigue siendo más clara.

También debes considerar la compatibilidad. Las t-strings requieren Python 3.14 o posterior. Una biblioteca compatible con versiones anteriores deberá ofrecer una alternativa. Puedes ampliar el tema con la guía de Type Hints en Python, el artículo sobre introspección con inspect, el contenido de f-strings para depuración y la categoría de Python Avanzado.

Diseñar un buen renderizador

Mantén cada renderizador pequeño y específico. HTML, SQL, comandos de shell, URLs y logs requieren reglas distintas. Valida los tipos permitidos, define cómo manejar formatos inválidos y evita ejecutar código adicional durante el renderizado. Prueba valores vacíos, Unicode, caracteres especiales, objetos personalizados y datos sensibles.

No supongas que toda expresión debe convertirse en texto. Un logger estructurado puede conservar el objeto original. Un adaptador de base de datos puede convertirlo en parámetro enlazado. Un renderizador HTML puede aceptar marcado confiable solo mediante un tipo contenedor explícito.

Rendimiento

Las t-strings añaden procesamiento estructurado, por lo que no son automáticamente más rápidas que las f-strings. Su ventaja es el control. Evita inspeccionar repetidamente la misma plantilla cuando puedas reutilizar una representación procesada. Mide el rendimiento en la aplicación real.

Para consultar los detalles oficiales, revisa la documentación de string.templatelib y la PEP 750, que explica la motivación y el diseño de las template strings.

Conclusión

Las t-strings no sustituyen a las f-strings en todos los casos. Resuelven un problema diferente: conservar una expresión interpolada como datos estructurados para que otro componente tome decisiones informadas. Al separar literales, valores, conversiones y formatos, string.templatelib permite renderizadores más seguros, logs más ricos y herramientas especializadas. Usa f-strings cuando solo necesites texto y t-strings cuando necesites controlar cómo se produce.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Base SQLite y código Python para exportación selectiva con iterdump
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    SQLite iterdump: crea dumps selectivos en Python

    Aprende sqlite3.Connection.iterdump con filtro para crear dumps SQLite selectivos, validar dependencias y restaurar con seguridad.

    Ler mais

    Tempo de leitura: 4 minutos
    21/10/2026
    Código y archivos que representan compresión de datos con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    compression.zstd: Zstandard rápido en Python

    Aprende compression.zstd en Python para comprimir archivos y datos con velocidad, streaming, integridad y seguridad.

    Ler mais

    Tempo de leitura: 7 minutos
    21/10/2026
    Archivo de configuración y estructura de código para ConfigParser en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    ConfigParser: lee INI sin sección en Python

    Aprende ConfigParser sin sección en Python con validación, tipos, compatibilidad, capas de configuración y escritura segura.

    Ler mais

    Tempo de leitura: 5 minutos
    20/10/2026
    Datos binarios y memoria de ordenador representando memoryview en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    memoryview count e index: busca sin copiar

    Aprende memoryview count e index en Python para buscar valores en buffers sin copias y validar datos binarios con eficiencia.

    Ler mais

    Tempo de leitura: 5 minutos
    20/10/2026
    Desarrolladora trabajando con código Python y validación de datos
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    map strict: detecta iterables desalineados

    Aprende map strict en Python para validar iterables, evitar truncamientos silenciosos y detectar datos desalineados.

    Ler mais

    Tempo de leitura: 4 minutos
    19/10/2026
    Carpetas organizadas que representan archivos y directorios en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    pathlib.Path.info: acelera recorridos de directorios

    Aprende pathlib.Path.info en Python para reutilizar metadatos, acelerar recorridos y evitar decisiones con caché desactualizada.

    Ler mais

    Tempo de leitura: 7 minutos
    19/10/2026