Python Reto #1 — Invertir una cadena de forma segura

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:

  1. Reciba un valor texto.
  2. Si texto es None, devuelva una cadena vacía "".
  3. Si texto no es un str, lance TypeError.
  4. 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

  1. En Python, una cadena puede invertirse con slicing: texto[::-1].
  2. Para validar tipos, puedes usar isinstance(texto, str).
  3. Decide reglas explícitas y cúmplelas (eso es “seguro” y testeable).

Solución explicada (paso a paso)

  1. Caso None: no intentamos invertir; devolvemos "" directamente.
  2. Validación de tipo: si no es str, es mejor fallar rápido con un TypeError claro.
  3. 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_segura


def 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)

  1. Soportar bytes: si es bytes, devolver bytes invertidos.
  2. Normalizar espacios: invertir solo caracteres alfanuméricos ignorando espacios (más difícil).
  3. 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.