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 leer_argumentos() -> str:
"""Lee y valida los argumentos de la línea de comandos.
:return: Texto a evaluar
"""
# Comprobamos que se ha proporcionado exactamente un argumento
if len(sys.argv) != 2:
print("Error: Se espera exactamente un argumento")
print("Uso: python palindromo.py \"texto a evaluar\"")
sys.exit(1)
return sys.argv[1]
def limpiar_texto(texto: str) -> str:
"""Limpia el texto dejando solo caracteres alfabéticos en minúsculas.
:param texto: Texto a limpiar
:return: Texto limpio
"""
texto_limpio = ''
for caracter in texto.lower():
if 'a' <= caracter <= 'z': # Verifica si es una letra minúscula
texto_limpio += caracter
return texto_limpio
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
"""
# Casos base
if len(texto) <= 1:
return True
# Comparamos primer y último carácter
if texto[0] != texto[-1]:
return False
# Llamada recursiva con el texto reducido (sin el primer y último carácter)
return palindromo(texto[1:-1])
def main():
texto_original = leer_argumentos()
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 cumple con los requisitos principales del 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. La limpieza del texto (convertir a minúsculas y eliminar no alfabéticos) se realiza antes de la recursión, como exige el enunciado. Los ejemplos proporcionados en el enunciado funcionarían correctamente:
-
"Anita lava la tina."→"anitalavalatina"(palíndromo). -
"Hola"→"hola"(no palíndromo).
Sin embargo, existe un problema crítico: la funciónlimpiar_textosolo considera caracteres entre'a'y'z'(ASCII), ignorando letras específicas del español comoñ,á,é, etc. Por ejemplo,"año"se limpiaría como"ao", lo cual es incorrecto (debería mantener lañ). Aunque los ejemplos del enunciado no incluyen estos casos, el enunciado menciona explícitamente "caracteres no alfabéticos", y en español las letras con diacríticos son alfabéticas.
Es fácil de leer y entender
El código es claro y accesible para principiantes. Las funciones tienen nombres descriptivos (leer_argumentos, limpiar_texto, palindromo), y los comentarios/docstrings explican su propósito. La lógica recursiva en palindromo es sencilla de seguir: compara extremos y reduce la cadena. El uso de texto[1:-1] para la llamada recursiva es intuitivo para quien conoce slicing. La estructura general (main + if __name__) sigue el esquema habitual enseñado.
Sigue buenas prácticas de programación
El programa separa responsabilidades en funciones bien definidas (entrada, limpieza, lógica recursiva), lo cual es una buena práctica. Los docstrings cumplen con la documentación mínima requerida. No obstante:
-
Falta validación de entrada robusta: Si el usuario introduce múltiples argumentos, el mensaje de error menciona
pythonen lugar depython3(como en el ejemplo del enunciado). -
Limpieza inadecuada de texto: Como se señaló, el enfoque
'a' <= caracter <= 'z'es insuficiente para el español. Se debería usarstr.isalpha()para identificar caracteres alfabéticos de forma universal. -
No se manejan casos extremos no especificados: Por ejemplo, si la cadena limpia queda vacía tras eliminar no alfabéticos (ej:
"123!@#"), el programa devuelveTrue(correcto por el enunciado), pero no hay comentarios que expliquen este comportamiento.
Recomendaciones de mejora
-
Mejorar
limpiar_texto: Reemplazar la comparación manual'a' <= caracter <= 'z'porcaracter.isalpha(). Esto garantizaría que letras comoñ,á, etc., se conserven. Ejemplo:texto_limpio = ''.join(caracter for caracter in texto.lower() if caracter.isalpha()) -
Ajustar el mensaje de error: En
leer_argumentos, cambiarpythonporpython3en el mensaje de uso para coincidir con el ejemplo del enunciado. -
Agregar comentario en
palindromo: Explicar explícitamente por qué cadenas vacías son palíndromos (ej: "Caso base: cadenas vacías o de 1 carácter son palíndromos por definición"). -
Validar entrada limpia: Aunque el enunciado no lo exige, sería útil añadir un comentario en
mainque aclare que sitexto_limpioqueda vacío, se considera palíndromo (ej:# Cadenas sin caracteres alfabéticos (ej: "123") son palíndromos por definición).
Estos cambios mantendrían la simplicidad para principiantes, pero resolverían problemas reales de internacionalización y claridad.