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:

OK

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

***ERROR:***
 Error 1
Mensaje de error:
.F
======================================================================
FAIL: test_main_rect (test_formas.TestCreacionFormas.test_main_rect)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python3.13/unittest/mock.py", line 1426, in patched
    return func(*newargs, **newkeywargs)
  File "/tmp/_tempmzbvt4l7/test_formas.py", line 43, in test_main_rect
    self.assertEqual(white, color_pos(x, y))
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Tuples differ: (255, 255, 255) != (0, 0, 255)

First differing element 0:
255
0

- (255, 255, 255)
+ (0, 0, 255)

----------------------------------------------------------------------
Ran 2 tests in 1.812s

FAILED (failures=1)



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

***ERROR:***
 Error 1
Mensaje de error:
.F
======================================================================
FAIL: test_dibuja_rectangulo (test_funciones.TestFuncionesFormas.test_dibuja_rectangulo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tmp/_tempu84cr2kq/test_funciones.py", line 32, in test_dibuja_rectangulo
    self.assertEqual(white, color_pos(x, y))
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Tuples differ: (255, 255, 255) != (0, 0, 255)

First differing element 0:
255
0

- (255, 255, 255)
+ (0, 0, 255)

----------------------------------------------------------------------
Ran 2 tests in 1.919s

FAILED (failures=1)



Revisión automática de programa

Programa revisado:

from pixels import tam_lienzo, pinta, espera
import sys


def lee_formas():
    argumentos = sys.argv[1:]
    formas = []
    i = 0
    
    while i < len(argumentos):
        tipo = argumentos[i]
        forma = {}
        
        if tipo == "cuad":
            if i + 3 > len(argumentos):
                print(f"Error: Faltan argumentos para el cuadrado en la posición {i+1}")
                sys.exit(1)
                
            forma = {
                "tipo": "cuadrado",
                "x": int(argumentos[i+1]),
                "y": int(argumentos[i+2]),
                "lado": int(argumentos[i+3])
            }
            
            # Si hay más argumentos después de los parámetros, asumimos que es un color
            if i + 4 < len(argumentos):
                forma["color"] = argumentos[i+4]
                i += 5
            else:
                i += 4
                
        elif tipo == "rect":
            if i + 4 >= len(argumentos):
                print(f"Error: Faltan argumentos para el rectángulo en la posición {i+1}")
                sys.exit(1)
                
            forma = {
                "tipo": "rectángulo",
                "x": int(argumentos[i+1]),
                "y": int(argumentos[i+2]),
                "ancho": int(argumentos[i+3]),
                "alto": int(argumentos[i+4])
            }
            

            if i + 5 < len(argumentos):
                forma["color"] = argumentos[i+5]
                i += 6
            else:
                i += 5
        else:
            print(f"Error al escribir la forma: {tipo}. Utiliza 'cuad' o 'rect'")
            sys.exit(1)
            
        formas.append(forma)
    
    return formas


def dibuja_cuadrado(x, y, lado, color="black"):
    max_x, max_y = tam_lienzo()
    
    # Verificar si el cuadrado cabe en el lienzo
    if (x < 0 or y < 0 or 
        x + lado > max_x or 
        y + lado > max_y or
        lado <= 0):
        return False
    
    # Dibujar el cuadrado
    for i in range(x, x + lado):
        for j in range(y, y + lado):
            if 0 <= i < max_x and 0 <= j < max_y:
                pinta(i, j, color)
            else:
                return False
    
    return True


def dibuja_rectangulo(x, y, ancho, alto, color="black"):
    max_x, max_y = tam_lienzo()
    
    # Verificar si el rectángulo cabe en el lienzo
    if (x < 0 or y < 0 or 
        x + ancho > max_x or 
        y + alto > max_y or
        ancho <= 0 or 
        alto <= 0):
        return False
    
    # Dibujar el rectángulo
    for i in range(x, x + ancho):
        for j in range(y, y + alto):
            if 0 <= i < max_x and 0 <= j < max_y:
                pinta(i, j, color)
            else:
                return False
    
    return True


def main():
    formas = lee_formas()

    for forma in formas:
        tipo = forma["tipo"]
        x = forma["x"]
        y = forma["y"]
        color = forma.get("color", "black")

        if tipo == "cuadrado":
            lado = forma["lado"]
            dibuja_cuadrado(x, y, lado, color)
        elif tipo == "rectángulo":
            ancho_forma = forma["ancho"]
            alto_forma = forma["alto"]
            dibuja_rectangulo(x, y, ancho_forma, alto_forma, color)

    espera()


if __name__ == "__main__":
    main()

Análisis

Cumple con el enunciado

El programa no cumple completamente con el enunciado. Aunque implementa las funciones requeridas y sigue la estructura básica, presenta dos errores críticos:

  1. Error en la validación de argumentos: En lee_formas(), al procesar un cuadrado (cuad), la condición i + 3 > len(argumentos) es incorrecta. Debería ser i + 3 >= len(argumentos) para detectar si faltan parámetros (ej.: cuad 2 3 fallaría silenciosamente). Esto causa IndexError en casos con parámetros insuficientes.
  2. Confusión entre color y nueva figura: No verifica si el argumento después de los parámetros obligatorios es cuad/rect (inicio de nueva figura) antes de asignarlo como color. Por ejemplo, en cuad 2 3 5 rect 10 8 6 3, tomaría "rect" como color del cuadrado, generando errores.

Es fácil de leer y entender

El código es moderadamente comprensible para principiantes:

  • Usa nombres de variables descriptivos (tipo, lado, ancho) y comentarios útiles.
  • La estructura de lee_formas() con while e if anidados es clara, pero la lógica para saltar índices (i += 5/i += 4) puede confundir al no explicar por qué se incrementa así.
  • Falta manejo explícito de casos límite (ej.: lado negativo), lo que dificulta entender por qué falla un dibujo.

Sigue buenas prácticas de programación

No aplica buenas prácticas clave:

  • Validación incompleta: No verifica si el "color" es un valor válido (ej.: "rect" no es un color) ni si los parámetros numéricos son positivos antes de convertirlos a int.
  • Redundancia en checks: En dibuja_cuadrado(), el bucle interno verifica coordenadas aunque la condición inicial ya las validó. Esto sugiere falta de confianza en la lógica previa.
  • Manejo rígido de errores: Usa sys.exit(1) en lee_formas(), lo que impide reutilizar la función en otros contextos (ej.: interfaz gráfica).

Recomendaciones de mejora

  1. Corrige la validación de parámetros en lee_formas():

    • Para cuad, cambia i + 3 > len(argumentos) por i + 3 >= len(argumentos).
    • Antes de asignar un color, verifica que el siguiente argumento no sea "cuad" o "rect" (ej.: if i+4 < len(...) and argumentos[i+4] not in ["cuad", "rect"]).
  2. Simplifica la lógica de dibujo:

    • Elimina las verificaciones dentro de los bucles en dibuja_cuadrado() y dibuja_rectangulo(). Si la condición inicial (x + lado > max_x, etc.) es correcta, los píxeles siempre estarán dentro del lienzo.
  3. Mejora la robustez:

    • Valida que lado, ancho y alto sean positivos antes de dibujar (ej.: if lado <= 0: return False).
    • Usa try/except al convertir argumentos a int para capturar errores de formato (ej.: cuad 2 tres 5).
  4. Clarifica los mensajes de error:

    • En lugar de "Faltan argumentos para el cuadrado", especifica cuáles faltan (ej.: "Faltan: x, y, lado").