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:
import sys
def palindromo(texto: str):
"""Determina si el texto es un palíndromo.
:param texto: Cadena de caracteres a evaluar, en minúsculas y sin caracteres no alfabéticos
returns: True si es palíndromo, False en caso contrario
"""
if len(texto) <= 1:
return True
if texto[0] == texto[-1]:
return palindromo(texto[1:-1])
return False
def limpiar_texto(texto: str) -> str:
"""Convierte a minúsculas y elimina caracteres no alfabéticos."""
texto = texto.lower()
limpio = "".join(ch for ch in texto if 'a' <= ch <= 'z')
return limpio
def main():
if len(sys.argv) != 2:
print('Uso: python3 palindromo.py "texto"')
sys.exit(1)
texto_original = sys.argv[1]
texto_limpio = limpiar_texto(texto_original)
if palindromo(texto_limpio):
print("Es palíndromo")
else:
print("No es palíndromo")
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa no cumple completamente con el enunciado. Aunque la función recursiva palindromo está bien implementada (maneja casos base, reduce el problema y no usa bucles), la función limpiar_texto tiene un error crítico: solo conserva caracteres entre 'a' y 'z' (ASCII), ignorando letras alfabéticas propias del español como ñ, á, é, etc. Por ejemplo, la cadena "año" se limpiaría como "ao", cuando debería mantener la ñ (considerada alfabética en español). El enunciado exige ignorar caracteres no alfabéticos, pero la implementación actual es demasiado restrictiva. Los ejemplos proporcionados en el enunciado no incluyen estos casos, pero el requisito es general.
Es fácil de leer y entender
El código es moderadamente legible para principiantes. La estructura de la función recursiva es clara y los nombres de variables son descriptivos. Sin embargo, la línea limpio = "".join(ch for ch in texto if 'a' <= ch <= 'z') usa una expresión generadora, un concepto que no se ha visto en clase (solo bucles for/while básicos). Esto podría confundir a estudiantes que aún no manejan construcciones avanzadas. Reemplazar esta línea con un bucle for explícito mejoraría la comprensión.
Sigue buenas prácticas de programación
Hay mejoras necesarias en buenas prácticas:
- La función
limpiar_textodebería usarch.isalpha()para identificar caracteres alfabéticos (incluye letras internacionales), en lugar de comparar rangos ASCII. - Falta validación explícita para cadenas vacías en la documentación de
limpiar_texto. - Aunque los docstrings son adecuados, no se menciona el manejo de Unicode, clave para el contexto del problema (español).
Recomendaciones de mejora
-
Corregir la limpieza de texto: Reemplazar
'a' <= ch <= 'z'porch.isalpha()enlimpiar_textopara incluir todas las letras alfabéticas (ej.:ñ,á).
Ejemplo:limpio = "" for ch in texto: if ch.isalpha(): limpio += ch -
Simplificar para principiantes: Usar un bucle
fortradicional en lugar de expresiones compactas (comojoincon generadores), ya que el curso solo ha cubierto bucles básicos. -
Refinar documentación: Añadir en el docstring de
limpiar_textoque se conservan todos los caracteres alfabéticos (no solo ASCII), alineándose con el requisito del enunciado.