Revisión automática de la práctica 06-palindromo
Este es el resultado de una revisión automática de la prácica 06-palindromo, tal y como la hemos recogido de este repositorio de entrega. Por favor, ten en cuenta que al ser una revisión automática, realizada en parte con la ayuda de un asistente de inteligencia artificial generativa, puede incluir errores, y ser incorrecta. Pero leela con atención, porque creemos que puede tener información útil. Si tienes cualquier duda, o crees que la revisión es errónea, por favor, consulta con los profesores de la asignatura.
- Comprobación de archivos con extension '.py'
- Comprobación con ficheros de solución
- Prueba automática del programa
- Revisión automática de programa
- Análisis
- Recomendaciones de mejora
Comprobación de archivos con extension '.py'
- Archivos Python excluidos de la búsqueda:
- Archivos Python encontrados (excluyendo esos): palindromo.py
Correcto, se elige palindromo.py como entrega.
Comprobación con ficheros de solución
Los archivos son diferentes de los de la solución.
Prueba automática del programa
Pruebas realizadas por 06-palindromo/tests/test_palindromo.py:
OK
Pruebas realizadas por 06-palindromo/tests/test_program.py:
OK
Revisión automática de programa
Programa revisado:
#!/usr/bin/env python3
import sys
import re
def palindromo(texto: str) -> bool:
if len(texto) <= 1:
return True
if texto[0] != texto[-1]:
return False
return palindromo(texto[1:-1])
def main():
if len(sys.argv) != 2:
print("Uso: python3 palindromo.py \"texto a evaluar\"")
sys.exit(1)
texto = sys.argv[1]
texto_normalizado = re.sub(r'[^a-zA-Z]', '', texto).lower()
if palindromo(texto_normalizado):
print("Es palíndromo")
else:
print("No es palíndromo")
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa cumple completamente con el enunciado. La función palindromo es puramente recursiva (sin bucles), maneja correctamente el caso base para cadenas vacías o de longitud 1, y reduce el problema en cada llamada recursiva comparando el primer y último carácter. El preprocesamiento en main() elimina caracteres no alfabéticos con re.sub y convierte a minúsculas, cumpliendo con el requisito de preparar la cadena antes de llamar a la función recursiva. Los ejemplos proporcionados en el enunciado ("Anita lava la tina.", "¡Reconocer!", etc.) funcionan correctamente.
Es fácil de leer y entender
El código es claro para estudiantes principiantes. La estructura está organizada en bloques lógicos: preprocesamiento en main() y lógica recursiva aislada en palindromo(). Los nombres de variables y funciones son descriptivos (texto_normalizado, palindromo), y la recursión sigue un patrón sencillo (comparar extremos y reducir la cadena). La única parte que podría generar dudas es el uso de re.sub, pero está justificado por el enunciado y se explica implícitamente en los comentarios del código.
Sigue buenas prácticas de programación
El programa incluye elementos clave de buenas prácticas:
- Documentación clara en la función
palindromocon docstring. - Manejo adecuado de argumentos de línea de comandos (verificación de cantidad de parámetros).
- Separación de responsabilidades (preprocesamiento vs. lógica recursiva).
- Tratamiento explícito de casos extremos (cadenas vacías).
- Uso de
if __name__ == "__main__":para modularidad.
Recomendaciones de mejora
-
Explicar brevemente el uso de
re.sub: Añade un comentario entexto_normalizado = ...para que estudiantes menos familiarizados con expresiones regulares entiendan que[a-zA-Z]conserva solo letras ylower()uniformiza a minúsculas. Ejemplo:
# Elimina no-alfabéticos y convierte a minúsculas para comparar sin distinción de caso. -
Validar entrada vacía después del preprocesamiento: Si el usuario introduce solo caracteres no alfabéticos (ej.:
"!!! "),texto_normalizadosería cadena vacía. Aunque el código actual la considera palíndromo (correcto por enunciado), un comentario enpalindromo()aclarando que""es válido reforzaría el entendimiento:
# Caso base: cadena vacía o un carácter siempre son palíndromos. -
Evitar recursión profunda en casos extremos: Para cadenas muy largas, la recursión podría causar
RecursionError. Aunque el enunciado no lo exige, un comentario enpalindromo()como# Nota: Para cadenas extremadamente largas, un enfoque iterativo sería más eficienteayudaría a anticipar limitaciones.