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:
***ERROR:***
Error 1
Mensaje de error:
EEEE
======================================================================
ERROR: test_palindromo_palabra_false (test_palindromo.TestPalindromo.test_palindromo_palabra_false)
Palabras no palíndromas deben devolver False
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_tempng_4drub/test_palindromo.py", line 24, in test_palindromo_palabra_false
self.assertFalse(palindromo("python"))
~~~~~~~~~~^^^^^^^^^^
TypeError: palindromo() missing 1 required positional argument: 'm'
======================================================================
ERROR: test_palindromo_palabra_true (test_palindromo.TestPalindromo.test_palindromo_palabra_true)
Palabras palíndromas deben devolver True
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_tempng_4drub/test_palindromo.py", line 17, in test_palindromo_palabra_true
self.assertTrue(palindromo("reconocer"))
~~~~~~~~~~^^^^^^^^^^^^^
TypeError: palindromo() missing 1 required positional argument: 'm'
======================================================================
ERROR: test_palindromo_un_caracter (test_palindromo.TestPalindromo.test_palindromo_un_caracter)
Un solo carácter debe ser considerado palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_tempng_4drub/test_palindromo.py", line 13, in test_palindromo_un_caracter
self.assertTrue(palindromo("a"))
~~~~~~~~~~^^^^^
TypeError: palindromo() missing 1 required positional argument: 'm'
======================================================================
ERROR: test_palindromo_vacio (test_palindromo.TestPalindromo.test_palindromo_vacio)
Un string vacío debe ser considerado palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_tempng_4drub/test_palindromo.py", line 9, in test_palindromo_vacio
self.assertTrue(palindromo(""))
~~~~~~~~~~^^^^
TypeError: palindromo() missing 1 required positional argument: 'm'
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (errors=4)
Pruebas realizadas por 06-palindromo/tests/test_program.py:
***ERROR:***
Error 1
Mensaje de error:
FFFFFF
======================================================================
FAIL: test_no_palindromo (test_program.TestProgram.test_no_palindromo) (texto='Python')
Debe detectar correctamente cuando no es palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temprb7zu8gl/test_program.py", line 38, in test_no_palindromo
self.assertEqual(output.getvalue(), expected)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'No es un palindromo\n' != 'No es palíndromo\n'
- No es un palindromo
? --- ^
+ No es palíndromo
? ^
======================================================================
FAIL: test_no_palindromo (test_program.TestProgram.test_no_palindromo) (texto='Prueba')
Debe detectar correctamente cuando no es palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temprb7zu8gl/test_program.py", line 38, in test_no_palindromo
self.assertEqual(output.getvalue(), expected)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'No es un palindromo\n' != 'No es palíndromo\n'
- No es un palindromo
? --- ^
+ No es palíndromo
? ^
======================================================================
FAIL: test_no_palindromo (test_program.TestProgram.test_no_palindromo) (texto='Hola mundo')
Debe detectar correctamente cuando no es palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temprb7zu8gl/test_program.py", line 38, in test_no_palindromo
self.assertEqual(output.getvalue(), expected)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'No es un palindromo\n' != 'No es palíndromo\n'
- No es un palindromo
? --- ^
+ No es palíndromo
? ^
======================================================================
FAIL: test_palindromo_correcto (test_program.TestProgram.test_palindromo_correcto) (texto='Reconocer')
Debe detectar correctamente un palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temprb7zu8gl/test_program.py", line 23, in test_palindromo_correcto
self.assertEqual(output.getvalue(), expected)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'Es un palindromo\n' != 'Es palíndromo\n'
- Es un palindromo
? --- ^
+ Es palíndromo
? ^
======================================================================
FAIL: test_palindromo_correcto (test_program.TestProgram.test_palindromo_correcto) (texto='Anita lava la tina.')
Debe detectar correctamente un palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temprb7zu8gl/test_program.py", line 23, in test_palindromo_correcto
self.assertEqual(output.getvalue(), expected)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'Es un palindromo\n' != 'Es palíndromo\n'
- Es un palindromo
? --- ^
+ Es palíndromo
? ^
======================================================================
FAIL: test_palindromo_correcto (test_program.TestProgram.test_palindromo_correcto) (texto='Yo dono rosas, oro no doy')
Debe detectar correctamente un palíndromo
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temprb7zu8gl/test_program.py", line 23, in test_palindromo_correcto
self.assertEqual(output.getvalue(), expected)
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: 'Es un palindromo\n' != 'Es palíndromo\n'
- Es un palindromo
? --- ^
+ Es palíndromo
? ^
----------------------------------------------------------------------
Ran 2 tests in 0.002s
FAILED (failures=6)
Revisión automática de programa
Programa revisado:
import sys, re
def argumentos():
frase = str(sys.argv[1:])
frase_bien = re.sub(r'[^a-zA-Z]', '', frase)
frase_bien = frase_bien.lower()
return frase_bien
def palindromo(n, m):
frase_bien = argumentos()
try:
if frase_bien[n] == frase_bien[m]:
palindromo(n+1, m-1)
else:
print("No es un palindromo")
except:
print("Es un palindromo")
def main():
frase_bien = argumentos()
num = int(len(frase_bien)-1)
palindromo(0,num)
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
No cumple con los requisitos esenciales. La función palindromo debe recibir una cadena limpia como parámetro (según el esquema indicado: def palindromo(texto: str) -> bool), pero el programa usa dos índices (n y m) y no procesa la cadena directamente. Además, la función no devuelve un booleano sino que imprime el resultado directamente, lo que viola la especificación. El procesamiento de argumentos es incorrecto: sys.argv[1:] convierte la lista de argumentos en una cadena con corchetes y comillas (ej: "['Anita...']"), distorsionando la entrada. Tampoco maneja adecuadamente el caso base recursivo (usa try/except en lugar de condiciones explícitas).
Es fácil de leer y entender
No es claro para un principiante. La lógica recursiva se basa en índices globales y excepciones para el caso base, lo que complica entender el flujo. La función palindromo no refleja el enunciado (debería operar sobre la cadena, no sobre índices), y el uso de try/except para controlar la recursión es antinatural. Además, se llama a argumentos() múltiples veces (incluso en recursión), lo que genera confusión sobre qué datos se procesan en cada paso.
Sigue buenas prácticas de programación
No sigue buenas prácticas. La función recursiva debe recibir la cadena limpia como parámetro, pero aquí se accede a datos globales mediante argumentos(), rompiendo la pureza recursiva. El uso de excepciones para controlar el flujo normal (caso base) es incorrecto y poco eficiente. Además, no hay manejo explícito de casos base (cadena vacía o longitud 1), y la función no retorna valores booleanos, imposibilitando su reutilización.
Recomendaciones de mejora
-
Corrige la obtención de la entrada: Usa
sys.argv[1](nosys.argv[1:]) para obtener la cadena original, y limpia caracteres no alfabéticos antes de llamar apalindromo. -
Ajusta la firma de
palindromo: Debe serdef palindromo(texto: str) -> bool, recibiendo la cadena limpia (ej:"anitalavalatina"). -
Implementa recursión pura:
- Caso base:
if len(texto) <= 1: return True. - Llamada recursiva:
return texto[0] == texto[-1] and palindromo(texto[1:-1]).
- Caso base:
-
Elimina el uso de índices y excepciones: Trabaja directamente con subcadenas (
texto[1:-1]) para reducir el problema. -
Devuelve booleanos, no imprimas: En
main(), usaprint("Es palíndromo" if palindromo(cadena_limpia) else "No es palíndromo").