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
import re
def palindromo(texto: str) -> bool:
"""Determina si el texto es un palíndromo.
:param texto: Cadena de caracteres a evaluar, en minúsculas y sin caracteres no alfabéticos
:return: True si es palíndromo, False en caso contrario
"""
# Caso base: cadena vacía o de un solo carácter
if len(texto) <= 1:
return True
# Comparar primer y último carácter
if texto[0] != texto[-1]:
return False
# Llamada recursiva con el texto reducido
return palindromo(texto[1:-1])
def main():
# Validar que se haya pasado un argumento
if len(sys.argv) < 2:
print("Uso: python3 palindromo.py \"texto a evaluar\"")
return
# Tomar el texto original
original = sys.argv[1]
# Normalizar: convertir a minúsculas y eliminar caracteres no alfabéticos
limpio = re.sub(r'[^a-zA-Z]', '', original).lower()
# Llamar a la función recursiva
if palindromo(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 (caso base correcto, comparación de extremos y reducción del problema), el preprocesamiento de la cadena usa la librería re con re.sub(). El enunciado especifica que los alumnos sólo han visto construcciones básicas (bucles, condicionales, tipos básicos), y el uso de expresiones regulares no forma parte de esos conocimientos. El preprocesamiento debió hacerse con bucles y métodos de cadenas básicos (como isalpha() y lower()), no con librerías avanzadas. Además, el código ignora caracteres alfabéticos no ASCII (como ñ o tildes), lo cual es problemático en un contexto de español, aunque los ejemplos proporcionados no los incluyan.
Es fácil de leer y entender
El código es fácil de leer para un principiante. Usa nombres claros (limpio, original), comentarios breves y sigue una estructura lógica: preprocesamiento → llamada recursiva → salida. La función recursiva refleja claramente la idea de "comparar extremos y reducir la cadena", lo cual es intuitivo para quien está aprendiendo recursión. Sin embargo, el uso de re.sub() podría generar confusión, ya que no es un concepto básico cubierto en el curso.
Sigue buenas prácticas de programación
El programa tiene buenas prácticas parciales. Incluye docstrings, maneja argumentos de línea de comandos y separa responsabilidades (preprocesamiento vs. lógica recursiva). No obstante, el uso de re viola el principio de adecuación al nivel del alumno, y no se validan adecuadamente casos extremos como cadenas con espacios en blanco únicamente (aunque técnicamente se resuelven por el caso base). Además, la ausencia de manejo de caracteres no ASCII limita su utilidad en español real.
Recomendaciones de mejora
-
Reemplaza
re.sub()con un bucle básico: En lugar de usar expresiones regulares, procesa la cadena con unfory métodos comoisalpha(). Ejemplo:limpio = "" for char in original: if char.isalpha(): limpio += char.lower() -
Considera caracteres españoles: Aunque el enunciado no lo exige explícitamente, en un contexto hispano sería útil normalizar tildes y
ñ(ej.: usandounicodedata), pero como es para principiantes, basta con aclarar en comentarios que el código asume alfabeto inglés si no se cubrió ese tema. -
Añade validación para cadenas vacías tras el preprocesamiento: Aunque el caso base lo maneja, un comentario explicativo ayudaría a entender por qué
""es palíndromo. - Evita librerías avanzadas: Ajusta el preprocesamiento a las herramientas vistas en clase (bucles, condicionales, métodos de cadenas básicos).