Nivel: Principiante
Tema: Strings, validación básica, reglas explícitas, manejo de errores, tests con pytest
Objetivo: Validar direcciones de email usando reglas simples y claras, sin expresiones regulares complejas.
Enunciado
Crea una función llamada validar_email(email) que:
- Reciba un valor
email. - Si
emailesNone, devuelvaFalse. - Si
emailno es unstr, lanceTypeError. - Considere un email válido si cumple todas estas reglas simples:
- Contiene exactamente un carácter
@ - Tiene texto antes y después del
@ - La parte después del
@contiene al menos un punto. - No contiene espacios
- Contiene exactamente un carácter
- Devuelva
Truesi es válido, oFalseen caso contrario.
Este reto no pretende cubrir todas las reglas reales del estándar de email. Es una validación práctica y pedagógica.
Ejemplos
validar_email("usuario@email.com")→Truevalidar_email("user.name@mail.co")→Truevalidar_email("usuario@com")→Falsevalidar_email("@email.com")→Falsevalidar_email("usuario@email")→Falsevalidar_email("usuario email.com")→Falsevalidar_email(None)→Falsevalidar_email(123)→ TypeError
Pistas
- Usa
email.count("@")para comprobar cuántos@hay. - Puedes dividir el email con
split("@"). - Verifica espacios con
" " in email.
Solución explicada (paso a paso)
- Si el email es
None, no es válido →False. - Si no es una cadena, lanzamos
TypeError. - Comprobamos que haya exactamente un
@. - Separamos el email en dos partes: usuario y dominio.
- Verificamos que ambas partes tengan contenido.
- Confirmamos que el dominio tenga al menos un punto.
- Verificamos que no haya espacios.
- Si todo se cumple, el email es válido.
Ejecuta:
pytest -q
Variantes para subir de nivel (opcional)
- Usar expresiones regulares simples (
re) - Separar validación en funciones pequeñas
- Permitir dominios locales (
localhost) - Comparar con validadores de librerías reales
Lo que aprendiste
- Cómo definir reglas claras de validación
- Por qué “validar simple” suele ser suficiente al inicio
- Manejo explícito de errores vs valores inválidos
- Cómo testear lógica booleana con múltiples casos
Accede al código completo y a los tests en GitHub para ejecutar y modificar la solución localmente.
Continúa con Reto #12 — Convertir una lista en un diccionario (índice → valor) para practicar estructuras de datos y enumeración.