Skip to content

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'

  • 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

  1. Corrige la obtención de la entrada: Usa sys.argv[1] (no sys.argv[1:]) para obtener la cadena original, y limpia caracteres no alfabéticos antes de llamar a palindromo.
  2. Ajusta la firma de palindromo: Debe ser def palindromo(texto: str) -> bool, recibiendo la cadena limpia (ej: "anitalavalatina").
  3. Implementa recursión pura:
    • Caso base: if len(texto) <= 1: return True.
    • Llamada recursiva: return texto[0] == texto[-1] and palindromo(texto[1:-1]).
  4. Elimina el uso de índices y excepciones: Trabaja directamente con subcadenas (texto[1:-1]) para reducir el problema.
  5. Devuelve booleanos, no imprimas: En main(), usa print("Es palíndromo" if palindromo(cadena_limpia) else "No es palíndromo").