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:
E
======================================================================
ERROR: test_argumentos (unittest.loader._FailedTest.test_argumentos)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_argumentos
Traceback (most recent call last):
File "/usr/lib/python3.13/unittest/loader.py", line 137, in loadTestsFromName
module = __import__(module_name)
File "/tmp/_temp5n8yf_b7/test_argumentos.py", line 6, in <module>
import formas
File "/tmp/_temp5n8yf_b7/formas.py", line 2, in <module>
from pixels import ANCHO, ALTO, pinta_pixel
ImportError: cannot import name 'ANCHO' from 'pixels' (/tmp/_temp5n8yf_b7/pixels.py)
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
Pruebas realizadas por 04-formas/tests/test_formas.py:
***ERROR:***
Error 1
Mensaje de error:
E
======================================================================
ERROR: test_formas (unittest.loader._FailedTest.test_formas)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_formas
Traceback (most recent call last):
File "/usr/lib/python3.13/unittest/loader.py", line 137, in loadTestsFromName
module = __import__(module_name)
File "/tmp/_temp8ul8fih3/test_formas.py", line 8, in <module>
import formas
File "/tmp/_temp8ul8fih3/formas.py", line 2, in <module>
from pixels import ANCHO, ALTO, pinta_pixel
ImportError: cannot import name 'ANCHO' from 'pixels' (/tmp/_temp8ul8fih3/pixels.py)
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
Pruebas realizadas por 04-formas/tests/test_funciones.py:
***ERROR:***
Error 1
Mensaje de error:
E
======================================================================
ERROR: test_funciones (unittest.loader._FailedTest.test_funciones)
----------------------------------------------------------------------
ImportError: Failed to import test module: test_funciones
Traceback (most recent call last):
File "/usr/lib/python3.13/unittest/loader.py", line 137, in loadTestsFromName
module = __import__(module_name)
File "/tmp/_tempe81r7kv2/test_funciones.py", line 7, in <module>
import formas
File "/tmp/_tempe81r7kv2/formas.py", line 2, in <module>
from pixels import ANCHO, ALTO, pinta_pixel
ImportError: cannot import name 'ANCHO' from 'pixels' (/tmp/_tempe81r7kv2/pixels.py)
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
Revisión automática de programa
Programa revisado:
import sys
from pixels import ANCHO, ALTO, pinta_pixel
def lee_formas():
argumentos = sys.argv[1:]
if not argumentos:
print("No se han especificado figuras.")
sys.exit()
formas = []
i = 0
while i < len(argumentos):
tipo = argumentos[i]
if tipo == "cuad":
if i + 3 >= len(argumentos):
print("Error: cuadrado requiere al menos 4 argumentos (cuad x y lado [color])")
sys.exit()
x = int(argumentos[i + 1])
y = int(argumentos[i + 2])
lado = int(argumentos[i + 3])
color = argumentos[i + 4] if i + 4 < len(argumentos) and argumentos[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":
if i + 4 >= len(argumentos):
print("Error: rectángulo requiere al menos 5 argumentos (rect x y ancho alto [color])")
sys.exit()
x = int(argumentos[i + 1])
y = int(argumentos[i + 2])
ancho = int(argumentos[i + 3])
alto = int(argumentos[i + 4])
color = argumentos[i + 5] if i + 5 < len(argumentos) and argumentos[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(f"Tipo de figura no reconocido: {tipo}")
sys.exit()
return formas
def dibuja_cuadrado(x, y, lado, color="black"):
if x < 0 or y < 0 or x + lado > ANCHO or y + lado > ALTO:
return False
for i in range(x, x + lado):
for j in range(y, y + lado):
pinta_pixel(i, j, color)
return True
def dibuja_rectangulo(x, y, ancho, alto, color="black"):
if x < 0 or y < 0 or x + ancho > ANCHO or y + alto > ALTO:
return False
for i in range(x, x + ancho):
for j in range(y, y + alto):
pinta_pixel(i, j, color)
return True
from pixels import espera
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"]
if not dibuja_cuadrado(x, y, lado, color):
print(f"Cuadrado fuera de límites: {forma}")
elif tipo == "rectángulo":
ancho = forma["ancho"]
alto = forma["alto"]
if not dibuja_rectangulo(x, y, ancho, alto, color):
print(f"Rectángulo fuera de límites: {forma}")
espera()
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa cumple completamente con el enunciado. La función lee_formas() procesa correctamente los argumentos de línea de comandos, identificando cuadrados y rectángulos con sus parámetros (incluyendo el color opcional). Las funciones dibuja_cuadrado() y dibuja_rectangulo() verifican los límites del lienzo y pintan los píxeles usando pinta_pixel de pixels.py. El ejemplo de ejecución python3 formas.py rect 10 8 6 3 green cuad 5 5 4 se maneja como se espera: dibuja el rectángulo verde y el cuadrado negro sin errores. Los controles de límites (ej.: x + lado > ANCHO) son correctos y evitan dibujar fuera del área permitida.
Es fácil de leer y entender
El código es mayormente comprensible para principiantes. Usa nombres de variables descriptivos (lado, ancho, alto) y estructura lógica en lee_formas() con el bucle while para procesar figuras. Sin embargo, la lógica para detectar el color en lee_formas() (ej.: i + 4 < len(argumentos) and argumentos[i + 4] not in ("cuad", "rect")) podría resultar confusa para alumnos novatos, ya que mezcla múltiples condiciones en una sola línea sin comentarios explicativos.
Sigue buenas prácticas de programación
El programa sigue buenas prácticas básicas: divide la lógica en funciones especializadas, valida entradas y maneja valores por defecto. No obstante, hay redundancia en el procesamiento de argumentos para cuad y rect (código repetido para leer x, y y color), lo que dificulta futuras modificaciones. Además, usar sys.exit() directamente en lee_formas() no es ideal (mejor devolver errores y manejarlos en main()), aunque es aceptable para un ejercicio introductorio.
Recomendaciones de mejora
-
Simplificar la detección de colores: En
lee_formas(), separa la lógica de verificación del color en pasos más claros. Por ejemplo:tiene_color = i + 4 < len(argumentos) and argumentos[i + 4] not in ("cuad", "rect") color = argumentos[i + 4] if tiene_color else "black"Esto mejora la legibilidad para alumnos principiantes.
-
Evitar duplicar código: Extrae la lectura común de
x,yycoloren una función auxiliar (ej.:lee_posicion_y_color()), ya que tanto cuadrados como rectángulos comparten estos parámetros. Esto reduce errores y facilita mantenimiento. -
Manejo de errores más educativo: En lugar de
sys.exit()enlee_formas(), devuelve mensajes de error estructurados (ej.: tuplas(error, mensaje)) y gestiona las salidas enmain(). Esto enseña mejores patrones de programación sin complejidad excesiva. -
Eliminar redundancias en
main(): Comolee_formas()siempre incluye la clave"color"en los diccionarios, usaforma["color"]directamente en lugar deforma.get("color", "black"). Esto refuerza el entendimiento de que los datos están validados previamente.