Las f-strings, introducidas en Python 3.6, son la forma recomendada de formatear cadenas. Son más rápidas que str.format() y %, más legibles que la concatenación y ofrecen un control de formato sorprendentemente completo.
Sintaxis básica y expresiones
nombre = "Ana"
edad = 28
# Interpolación básica
print(f"Me llamo {nombre} y tengo {edad} años")
# Me llamo Ana y tengo 28 años
# Cualquier expresión válida dentro de {}
print(f"El doble de {edad} es {edad * 2}")
print(f"Mayúsculas: {nombre.upper()}")
print(f"Lista: {[x**2 for x in range(5)]}")
# Condicional inline
activo = True
print(f"Estado: {'activo' if activo else 'inactivo'}")
Format spec: decimales y alineación
Después de los dos puntos (:) dentro de la llave se escribe la especificación de formato, con la misma sintaxis que format():
precio = 1234.5678
pi = 3.14159265
# Decimales
print(f"{precio:.2f}") # 1234.57
print(f"{pi:.4f}") # 3.1416
# Separador de miles
print(f"{1234567:,}") # 1,234,567
print(f"{1234567:_.2f}") # 1_234_567.00
# Alineación: < izquierda, > derecha, ^ centrado
print(f"{'hola':>10}") # hola
print(f"{'hola':<10}!") # hola !
print(f"{'hola':^10}") # hola
# Padding con carácter
print(f"{'42':0>5}") # 00042
# Porcentaje
ratio = 0.12345
print(f"{ratio:.1%}") # 12.3%
Conversiones: !r y !s
texto = "HolanMundo"
objeto = [1, 2, 3]
print(f"{texto!s}") # HolanMundo (str())
print(f"{texto!r}") # 'HolanMundo' (repr() útil para ver caracteres especiales)
print(f"{objeto!r}") # [1, 2, 3]
El truco f'{var=}' para depurar (Python 3.8+)
x = 42
y = [1, 2, 3]
nombre = "Python"
# El signo = imprime nombre y valor
print(f"{x=}") # x=42
print(f"{y=}") # y=[1, 2, 3]
print(f"{nombre=}") # nombre='Python'
# Combinable con format spec
import math
angulo = math.pi / 4
print(f"{angulo=:.4f}") # angulo=0.7854
# Muy útil para depuración rápida sin print("x =", x)
def calcular(a, b):
resultado = a * b + a
print(f"{a=}, {b=}, {resultado=}")
return resultado
f-strings multilínea y anidadas
usuarios = [{"nombre": "Ana", "edad": 28}, {"nombre": "Luis", "edad": 34}]
# Multilínea
tabla = (
f"{'Nombre':<10} {'Edad':>5}n"
f"{'-'*10} {'-'*5}n"
)
for u in usuarios:
tabla += f"{u['nombre']:<10} {u['edad']:>5}n"
print(tabla)
Por qué nunca usar f-strings para SQL
# MAL SQL injection
usuario_id = input("ID: ")
# cursor.execute(f"SELECT * FROM usuarios WHERE id = {usuario_id}")
# Si usuario_id = "1 OR 1=1", filtra toda la tabla
# BIEN parámetros vinculados
usuario_id = input("ID: ")
cursor.execute("SELECT * FROM usuarios WHERE id = %s", (usuario_id,))
Las f-strings son para construir cadenas de texto para mostrar al usuario, escribir en logs o generar documentos. Para consultas a bases de datos, URLs con parámetros o cualquier dato que venga del usuario, usa siempre parámetros vinculados o las funciones de encoding correspondientes.
