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'
- 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: 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:
-
Error en la validación de argumentos: En
lee_formas(), al procesar un cuadrado (cuad), la condicióni + 3 > len(argumentos)es incorrecta. Debería seri + 3 >= len(argumentos)para detectar si faltan parámetros (ej.:cuad 2 3fallaría silenciosamente). Esto causa IndexError en casos con parámetros insuficientes. -
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, encuad 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()conwhileeifanidados 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 aint. -
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)enlee_formas(), lo que impide reutilizar la función en otros contextos (ej.: interfaz gráfica).
Recomendaciones de mejora
-
Corrige la validación de parámetros en
lee_formas():- Para
cuad, cambiai + 3 > len(argumentos)pori + 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"]).
- Para
-
Simplifica la lógica de dibujo:
- Elimina las verificaciones dentro de los bucles en
dibuja_cuadrado()ydibuja_rectangulo(). Si la condición inicial (x + lado > max_x, etc.) es correcta, los píxeles siempre estarán dentro del lienzo.
- Elimina las verificaciones dentro de los bucles en
-
Mejora la robustez:
- Valida que
lado,anchoyaltosean positivos antes de dibujar (ej.:if lado <= 0: return False). - Usa
try/exceptal convertir argumentos aintpara capturar errores de formato (ej.:cuad 2 tres 5).
- Valida que
-
Clarifica los mensajes de error:
- En lugar de
"Faltan argumentos para el cuadrado", especifica cuáles faltan (ej.:"Faltan: x, y, lado").
- En lugar de