Nivel: Principiante
Tema: Strings, validación de entradas, pruebas con pytest
Objetivo: Escribir una función que invierta un texto de forma robusta, manejando casos comunes (entrada vacía, None, tipos incorrectos) sin romper el programa.
Qué vas a practicar
- Manipulación básica de cadenas
- Validación de entradas (programación defensiva)
- Diferencia entre “fallar rápido” (errores) y “ser tolerante” (retornar valores por defecto)
- Tests automatizados con
pytest
Enunciado
Crea una función llamada invertir_cadena_segura(texto) que:
- Reciba un valor
texto. - Si
textoesNone, devuelva una cadena vacía"". - Si
textono es unstr, lanceTypeError. - Si es un
str, devuelva el texto invertido.
Ejemplos
invertir_cadena_segura("hola")→"aloh"invertir_cadena_segura("")→""invertir_cadena_segura(None)→""invertir_cadena_segura(123)→ TypeError
Pistas
- En Python, una cadena puede invertirse con slicing:
texto[::-1]. - Para validar tipos, puedes usar
isinstance(texto, str). - Decide reglas explícitas y cúmplelas (eso es “seguro” y testeable).
Solución explicada (paso a paso)
- Caso
None: no intentamos invertir; devolvemos""directamente. - Validación de tipo: si no es
str, es mejor fallar rápido con unTypeErrorclaro. - Inversión: usamos slicing
[::-1], que es simple, rápido y legible.
def invertir_cadena_segura(texto: str | None) -> str:
"""Invierte una cadena de forma segura.Reglas:
- None -> "" (cadena vacía)
- No str -> TypeError
- str -> cadena invertida"""if texto is None:
return ""
if not isinstance(texto, str):
raise TypeError("El parámetro 'texto' debe ser una cadena (str) o None.")
return texto[::-1]
import pytest
from reto_01_invertir_cadena import invertir_cadena_seguradef test_invierte_texto_normal():
assert invertir_cadena_segura("hola") == "aloh"def test_cadena_vacia():
assert invertir_cadena_segura("") == ""def test_none_devuelve_vacio():
assert invertir_cadena_segura(None) == ""def test_tipo_incorrecto_lanza_typeerror():
with pytest.raises(TypeError):
invertir_cadena_segura(123)
Y el archivo de código reto_01_invertir_cadena.py debe contener la función.
Variantes para subir de nivel (opcional)
- Soportar
bytes: si esbytes, devolverbytesinvertidos. - Normalizar espacios: invertir solo caracteres alfanuméricos ignorando espacios (más difícil).
- Invertir por palabras:
"hola mundo"→"mundo hola".
Lo que aprendiste
- Cómo invertir cadenas de forma idiomática en Python (
[::-1]) - Cómo escribir funciones robustas con reglas explícitas
- Cómo probar comportamiento “normal” y “errores” con
pytest
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Si terminaste este reto, sigue con el siguiente: Reto #2 — Contar palabras en una frase.
Si quieres el código listo para ejecutar, guárdalo en tu repositorio y ejecuta: pytest -q.