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:
***ERROR:***
Error 1
Mensaje de error:
EE
======================================================================
ERROR: test_lee_formas_cuad (test_argumentos.TestArgumentos.test_lee_formas_cuad)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_tempvnqc4lbj/test_argumentos.py", line 14, in test_lee_formas_cuad
resultado = formas.lee_formas()
File "/tmp/_tempvnqc4lbj/formas.py", line 11, in lee_formas
return formas
^^^^^^
NameError: name 'formas' is not defined. Did you mean: 'format'?
======================================================================
ERROR: test_lee_formas_rect (test_argumentos.TestArgumentos.test_lee_formas_rect)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_tempvnqc4lbj/test_argumentos.py", line 23, in test_lee_formas_rect
resultado = formas.lee_formas()
File "/tmp/_tempvnqc4lbj/formas.py", line 11, in lee_formas
return formas
^^^^^^
NameError: name 'formas' is not defined. Did you mean: 'format'?
----------------------------------------------------------------------
Ran 2 tests in 0.001s
FAILED (errors=2)
Pruebas realizadas por 04-formas/tests/test_formas.py:
***ERROR:***
Error 1
Mensaje de error:
EE
======================================================================
ERROR: test_main_cuad (test_formas.TestCreacionFormas.test_main_cuad)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.13/unittest/mock.py", line 1426, in patched
return func(*newargs, **newkeywargs)
File "/tmp/_temprtftdl6r/test_formas.py", line 21, in test_main_cuad
formas.main()
~~~~~~~~~~~^^
File "/tmp/_temprtftdl6r/formas.py", line 27, in main
formas = lee_formas()
File "/tmp/_temprtftdl6r/formas.py", line 11, in lee_formas
return formas
^^^^^^
NameError: name 'formas' is not defined. Did you mean: 'format'?
======================================================================
ERROR: 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/_temprtftdl6r/test_formas.py", line 38, in test_main_rect
formas.main()
~~~~~~~~~~~^^
File "/tmp/_temprtftdl6r/formas.py", line 27, in main
formas = lee_formas()
File "/tmp/_temprtftdl6r/formas.py", line 11, in lee_formas
return formas
^^^^^^
NameError: name 'formas' is not defined. Did you mean: 'format'?
----------------------------------------------------------------------
Ran 2 tests in 1.582s
FAILED (errors=2)
Pruebas realizadas por 04-formas/tests/test_funciones.py:
***ERROR:***
Error 1
Mensaje de error:
FF
======================================================================
FAIL: test_dibuja_cuadrado (test_funciones.TestFuncionesFormas.test_dibuja_cuadrado)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temp6_mgkc6l/test_funciones.py", line 18, in test_dibuja_cuadrado
self.assertEqual(blue, color_pos(2, 3))
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Tuples differ: (0, 0, 255) != (255, 255, 255)
First differing element 0:
0
255
- (0, 0, 255)
+ (255, 255, 255)
======================================================================
FAIL: test_dibuja_rectangulo (test_funciones.TestFuncionesFormas.test_dibuja_rectangulo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/tmp/_temp6_mgkc6l/test_funciones.py", line 34, in test_dibuja_rectangulo
self.assertEqual(blue, color_pos(x, y))
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
AssertionError: Tuples differ: (0, 0, 255) != (255, 255, 255)
First differing element 0:
0
255
- (0, 0, 255)
+ (255, 255, 255)
----------------------------------------------------------------------
Ran 2 tests in 1.581s
FAILED (failures=2)
Revisión automática de programa
Programa revisado:
import sys
from pixels import tam_lienzo, pinta, espera
def lee_formas():
"""Lee los argumentos de línea de comandos y construye una lista de
diccionarios que representan las formas."""
argumentos = sys.argv[1:]
...
return formas
def dibuja_cuadrado(x, y, lado, color="black"):
"""Dibuja un cuadrado en el lienzo."""
...
def dibuja_rectangulo(x, y, ancho, alto, color="black"):
"""Dibuja un rectángulo en el lienzo."""
...
def main():
"""Programa principal"""
(ancho, alto) = tam_lienzo()
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 con el enunciado. Las funciones críticas lee_formas(), dibuja_cuadrado() y dibuja_rectangulo() están incompletas (solo tienen ... como marcador de posición). Sin implementar estas funciones, el programa no puede:
- Procesar los argumentos de línea de comandos (ej.:
cuad 2 3 5 blue). - Dibujar figuras geométricas ni validar si se salen del lienzo.
- Cumplir con los ejemplos de ejecución proporcionados (como
python3 formas.py cuad 2 3 5 blue).
Es fácil de leer y entender
El esqueleto del código sigue la estructura sugerida en el enunciado, con comentarios explicativos y nombres de variables claros (ej.: x, y, lado). Sin embargo, carece de lógica funcional, lo que dificulta entender cómo se resolvería el problema. Un alumno principiante no podría aprender de este código vacío, ya que no muestra cómo procesar argumentos o interactuar con el módulo pixels.py.
Sigue buenas prácticas de programación
El código base incluye elementos correctos, como:
- Uso de
if __name__ == "__main__":para el punto de entrada. - Parámetros con valores por defecto (ej.:
color="black"). - Manejo seguro de claves opcionales con
.get().
Pero no aplica buenas prácticas en la lógica faltante, como validación de límites del lienzo o manejo de errores en los argumentos. Además, el uso de...en lugar de código real impide evaluar si se respetan principios como la legibilidad o la modularización.
Recomendaciones de mejora
-
Implementa
lee_formas():- Recorre
sys.argv[1:]para agrupar argumentos por figura (ej.:["cuad", "2", "3", "5", "blue"]). - Convierte valores numéricos a enteros y asigna el tipo correcto (
"cuadrado"para"cuad","rectángulo"para"rect"). - Ejemplo: Si el usuario escribe
cuad 2 3 5, el diccionario debe ser{"tipo": "cuadrado", "x": 2, "y": 3, "lado": 5}.
- Recorre
-
Completa las funciones de dibujo:
- En
dibuja_cuadrado()ydibuja_rectangulo(), usatam_lienzo()para verificar que la figura no se salga del lienzo. - Itera sobre los píxeles a pintar (ej.: con bucles
for) y llama apinta(x, y, color)para cada uno. - Retorna
Truesi todo el dibujo cabe en el lienzo,Falseen caso contrario.
- En
-
Ajusta el manejo de tipos en
main():- El enunciado usa
cuadyrecten la línea de comandos, pero el código actual espera"cuadrado"y"rectángulo". Asegúrate de quelee_formas()genere los tipos correctos para que coincidan con las comparaciones enmain().
- El enunciado usa
-
Añade validaciones básicas:
- En
lee_formas(), verifica que los argumentos numéricos sean válidos (ej.:lado > 0). - Si falta un parámetro (ej.: color opcional), usa el valor por defecto (
"black").
- En