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:
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

  1. 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}.
  2. Completa las funciones de dibujo:

    • En dibuja_cuadrado() y dibuja_rectangulo(), usa tam_lienzo() para verificar que la figura no se salga del lienzo.
    • Itera sobre los píxeles a pintar (ej.: con bucles for) y llama a pinta(x, y, color) para cada uno.
    • Retorna True si todo el dibujo cabe en el lienzo, False en caso contrario.
  3. Ajusta el manejo de tipos en main():

    • El enunciado usa cuad y rect en la línea de comandos, pero el código actual espera "cuadrado" y "rectángulo". Asegúrate de que lee_formas() genere los tipos correctos para que coincidan con las comparaciones en main().
  4. 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").