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/_tempqohhii1i/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.658s
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/_temphqj1j4dj/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.647s
FAILED (failures=1)
Revisión automática de programa
Programa revisado:
import sys
from pixels import tam_lienzo, pinta, espera
def lee_formas():
args = sys.argv[1:]
if not args:
print("No hay figuras para dibujar.")
sys.exit()
formas = []
i = 0
while i < len(args):
tipo = args[i]
if tipo == "cuad":
x, y, lado = int(args[i+1]), int(args[i+2]), int(args[i+3])
color = args[i+4] if i + 4 < len(args) and args[i+4] not in ["cuad", "rect"] else "black"
formas.append({"tipo": "cuadrado", "x": x, "y": y, "lado": lado, "color": color})
i += 5 if color != "black" else 4
elif tipo == "rect":
x, y, ancho, alto = int(args[i+1]), int(args[i+2]), int(args[i+3]), int(args[i+4])
color = args[i+5] if i + 5 < len(args) and args[i+5] not in ["cuad", "rect"] else "black"
formas.append({"tipo": "rectángulo", "x": x, "y": y, "ancho": ancho, "alto": alto, "color": color})
i += 6 if color != "black" else 5
else:
print("Tipo de figura no reconocido.")
sys.exit()
return formas
def dibuja_cuadrado(x, y, lado, color="black"):
ancho, alto = tam_lienzo()
if x < 0 or y < 0 or x + lado > ancho or y + lado > alto:
return False
for i in range(lado):
for j in range(lado):
pinta(x + i, y + j, color)
return True
def dibuja_rectangulo(x, y, ancho, alto, color="black"):
lim_x, lim_y = tam_lienzo()
if x < 0 or y < 0 or x + ancho > lim_x or y + alto > lim_y:
return False
for i in range(ancho):
for j in range(alto):
pinta(x + i, y + j, color)
return True
def main():
formas = lee_formas()
for f in formas:
if f["tipo"] == "cuadrado":
dibuja_cuadrado(f["x"], f["y"], f["lado"], f["color"])
elif f["tipo"] == "rectángulo":
dibuja_rectangulo(f["x"], f["y"], f["ancho"], f["alto"], f["color"])
espera()
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa cumple parcialmente con el enunciado.
- Lee_formas() procesa correctamente los argumentos de línea de comandos, identifica tipos de figuras ("cuad"/"rect"), asigna colores opcionales y construye los diccionarios con claves adecuadas ("cuadrado"/"rectángulo").
- Dibuja_cuadrado() y dibuja_rectangulo() verifican límites del lienzo y pintan píxeles correctamente.
-
Sin embargo, no se validan tamaños negativos o cero en
lado,anchooalto. Por ejemplo, si el usuario ingresacuad 2 3 -2, el buclerange(-2)no ejecuta ninguna iteración (no dibuja nada), pero la función devuelveTrueal pasar la comprobación de límites (ya quex + ladosería menor quex, pero no necesariamente fuera del lienzo). Esto viola el requisito de devolverFalsesi la figura "no se puede pintar bien".
Es fácil de leer y entender
El código es comprensible para principiantes en la mayoría de los casos:
- Nombres de variables claros (
x,y,lado,ancho,alto). - Estructura lógica en
dibuja_cuadrado()ydibuja_rectangulo()con bucles anidados intuitivos. -
Pero la función
lee_formas()es compleja para principiantes: el uso de un índiceimanual para recorrer argumentos y las condiciones anidadas para detectar colores pueden generar confusión. Por ejemplo, la líneai += 5 if color != "black" else 4es propensa a errores si no se entiende bien el flujo.
Sigue buenas prácticas de programación
Hay aspectos mejorables:
-
Falta validación de entradas: No se comprueba si
lado,anchooaltoson positivos, lo que puede causar comportamientos inesperados (ej.: tamaños negativos). -
Manejo de errores limitado: Si faltan parámetros numéricos (ej.:
cuad 2 3), el programa falla conIndexErrorsin un mensaje claro. -
Densidad lógica en
lee_formas(): La función mezcla parsing de argumentos, detección de colores y validación de tipos en un solo bloque, lo que dificulta su mantenimiento.
Recomendaciones de mejora
-
Valida tamaños positivos: En
dibuja_cuadrado()ydibuja_rectangulo(), añade al inicio:if lado <= 0: # o ancho <= 0 / alto <= 0 return FalseEsto garantiza que tamaños inválidos devuelvan
False. -
Mejora el manejo de errores en
lee_formas():- Verifica que haya suficientes argumentos numéricos antes de convertirlos a
int. Por ejemplo, paracuad:if i + 3 >= len(args): print("Faltan parámetros para el cuadrado.") sys.exit()
- Verifica que haya suficientes argumentos numéricos antes de convertirlos a
-
Simplifica el parsing de colores:
En lugar de depender deargs[i+4] not in ["cuad", "rect"], asume que el color es el siguiente argumento solo si no es un nuevo tipo de figura. Podrías usar:color = "black" if i + 4 < len(args) and args[i+4] not in ["cuad", "rect"]: color = args[i+4] i += 1 # Avanza solo si hay color i += 4 # Avanza siempre los 4 parámetros obligatoriosEsto reduce la complejidad del cálculo de
i.