Skip to content

Revisión automática de la práctica 04-formas

Este es el resultado de una revisión automática de la prácica 04-formas, 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: pixels.py
  • Archivos Python encontrados (excluyendo esos): formas.py

Correcto, se elige formas.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 04-formas/tests/test_argumentos.py:

***ERROR:***
 Error 1
Mensaje de error:
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/usr/lib/python3.13/unittest/__main__.py", line 18, in <module>
    main(module=None)
    ~~~~^^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/main.py", line 103, in __init__
    self.parseArgs(argv)
    ~~~~~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/unittest/main.py", line 142, in parseArgs
    self.createTests()
    ~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/unittest/main.py", line 153, in createTests
    self.test = self.testLoader.loadTestsFromNames(self.testNames,
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
                                                   self.module)
                                                   ^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/loader.py", line 207, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
              ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/loader.py", line 137, in loadTestsFromName
    module = __import__(module_name)
  File "/tmp/_temp7p4s0wsc/test_argumentos.py", line 6, in <module>
    import formas
  File "/tmp/_temp7p4s0wsc/formas.py", line 19
    elif args[i] == "rect":
                           ^
IndentationError: unindent does not match any outer indentation level



Pruebas realizadas por 04-formas/tests/test_formas.py:

***ERROR:***
 Error 1
Mensaje de error:
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/usr/lib/python3.13/unittest/__main__.py", line 18, in <module>
    main(module=None)
    ~~~~^^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/main.py", line 103, in __init__
    self.parseArgs(argv)
    ~~~~~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/unittest/main.py", line 142, in parseArgs
    self.createTests()
    ~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/unittest/main.py", line 153, in createTests
    self.test = self.testLoader.loadTestsFromNames(self.testNames,
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
                                                   self.module)
                                                   ^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/loader.py", line 207, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
              ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/loader.py", line 137, in loadTestsFromName
    module = __import__(module_name)
  File "/tmp/_temptgzqhaqc/test_formas.py", line 8, in <module>
    import formas
  File "/tmp/_temptgzqhaqc/formas.py", line 19
    elif args[i] == "rect":
                           ^
IndentationError: unindent does not match any outer indentation level



Pruebas realizadas por 04-formas/tests/test_funciones.py:

***ERROR:***
 Error 1
Mensaje de error:
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/usr/lib/python3.13/unittest/__main__.py", line 18, in <module>
    main(module=None)
    ~~~~^^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/main.py", line 103, in __init__
    self.parseArgs(argv)
    ~~~~~~~~~~~~~~^^^^^^
  File "/usr/lib/python3.13/unittest/main.py", line 142, in parseArgs
    self.createTests()
    ~~~~~~~~~~~~~~~~^^
  File "/usr/lib/python3.13/unittest/main.py", line 153, in createTests
    self.test = self.testLoader.loadTestsFromNames(self.testNames,
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^
                                                   self.module)
                                                   ^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/loader.py", line 207, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
              ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "/usr/lib/python3.13/unittest/loader.py", line 137, in loadTestsFromName
    module = __import__(module_name)
  File "/tmp/_tempm1jw77_q/test_funciones.py", line 7, in <module>
    import formas
  File "/tmp/_tempm1jw77_q/formas.py", line 19
    elif args[i] == "rect":
                           ^
IndentationError: unindent does not match any outer indentation level



Revisión automática de programa

Programa revisado:

from pixels import tam_lienzo, pinta, espera


def lee_formas():
    args = sys.argv[1:]
    formas = []
    i = 0

    while i < len(args):
        if args[i] == "cudd":
            x, y, lado = int(args[i+1]), int(args[i+2]), int(args[i+3])
            color = "black"
            i += 4
            if i < len(args) and not args[i].lstrip('-').isdigit():
                color = args[i]
                i += 1
            formas.append({"tipo": "cudd", "x": x, "y": y, "lado": lado, "color": color})
        
         elif args[i] == "rect":
            x, y, ancho, alto = int(args[i+1]), int(args[i+2]), int(args[i+3]), int(args[i+4])
            color = "black"
            i += 5
            if i < len(args) and not args[i].lstrip('-').isdigit():
                color = args[i]
                i += 1
            formas.append({"tipo": "rect", "x": x, "y": y, "ancho": ancho, "alto": alto, "color": color})

        
         else:
            i += 1

    return formas

def dibuja_cuadrado(x, y, lado, color="black"):
    ancho_l, alto_l = tam_lienzo()
    exito = True

    if x < 0 or y < 0 or x + lado > ancho_l or y + lado > alto_l:
        exito = False

    for i in range(x, x + lado):
        for j in range(y, y + lado):
            if 0 <= i < ancho_l and 0 <= j < alto_l:
                pinta(i, j, color)

    return exito

def dibuja_rectangulo(x, y, ancho, alto, color="black"):
    ancho_l, alto_l = tam_lienzo()
    exito = True

    if x < 0 or y < 0 or x + ancho > ancho_l or y + alto > alto_l:
        exito = False

    for i in range(x, x + ancho):
        for j in range(y, y + alto):
            if 0 <= i < ancho_l and 0 <= j < alto_l:
                pinta(i, j, color)

    return exito

def main():
    formas = lee_formas()

    for forma in formas:
        if forma["tipo"] == "cudd":
            dibuja_cuadrado(forma["x"], forma["y"], forma["lado"], forma["color"])
        elif forma["tipo"] == "rect":
            dibuja_rectangulo(forma["x"], forma["y"], forma["ancho"], forma["alto"], forma["color"])

    espera()


if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

No cumple completamente. El código tiene un error crítico: en lee_formas() se busca "cudd" en lugar de "cuad", por lo que no procesa correctamente los cuadrados según el enunciado. Por ejemplo, el comando python3 formas.py cuad 2 3 5 blue sería ignorado. Además, la detección del color es incorrecta: si después de los parámetros numéricos viene otra figura (ej: cuad 5 5 4 rect 10 8...), el código interpretará "rect" como color, generando errores. Tampoco se validan casos donde falten argumentos numéricos (ej: cuad 2 3 sin lado).

Es fácil de leer y entender

El código es confuso para principiantes. El error de escritura "cudd" en lugar de "cuad" genera dudas sobre si es un error o una intención deliberada. La lógica not args[i].lstrip('-').isdigit() para detectar colores es compleja y no está explicada, lo que dificulta entender cuándo se asigna un color o se inicia una nueva figura. Los nombres de variables son adecuados, pero la falta de comentarios en partes clave (como el procesamiento de argumentos) resta claridad.

Sigue buenas prácticas de programación

No sigue buenas prácticas básicas. El uso de "cudd" en lugar de "cuad" viola directamente el enunciado, lo que demuestra falta de atención a los requisitos. La detección de colores asume que cualquier texto no numérico es un color, sin verificar si corresponde al inicio de una nueva figura (ej: "rect"), lo que genera comportamientos inesperados. Además, no hay validación de que los argumentos numéricos existan antes de convertirlos con int(), lo que causaría errores en ejecución ante entradas incompletas.

Recomendaciones de mejora

  • Corrige "cudd" por "cuad" en todas las partes del código para cumplir con el enunciado.
  • En lee_formas(), verifica si el siguiente argumento es "cuad" o "rect" antes de considerarlo como color. Si no lo es, entonces es un color válido.
  • Añade comprobaciones para asegurar que hay suficientes argumentos numéricos antes de convertirlos (ej: if i+3 < len(args) para cuadrados).
  • Simplifica la lógica de detección de color usando una lista de tipos válidos (["cuad", "rect"]) y verifica si el siguiente argumento pertenece a ella.
  • Incluye comentarios breves explicando pasos clave, como "Verificar si hay color opcional después de los parámetros numéricos".