Revisión automática de la práctica 03-imagen
Este es el resultado de una revisión automática de la prácica 03-imagen, 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 plantilla
- Comprobación con ficheros de solución
- 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, invert.py
- Archivos Python encontrados (excluyendo esos): proccess.py
Correcto, se elige proccess.py como entrega.
Comprobación con ficheros de plantilla
Los archivos son diferentes de los de la plantilla.
Comprobación con ficheros de solución
Los archivos son diferentes de los de la solución.
Revisión automática de programa
Programa revisado:
#!/usr/bin/env python3
"""
Programa para modificar el brillo y el desplazamiento de color de una imagen, usando pixels.py
"""
import sys
import pixels
def lee_argumentos() -> tuple[str, float, int]:
"""Lee los argumentos de la línea de comandos"""
if len(sys.argv) != 4:
print("Uso: python3 process.py <imagen.gif> <brillo(float)> <desplazamiento(int)>")
sys.exit(1)
imagen = sys.argv[1]
try:
brillo = float(sys.argv[2])
desplazamiento = int(sys.argv[3])
except ValueError:
print("Error: el brillo debe ser un número real y el desplazamiento un número entero.")
sys.exit(1)
return imagen, brillo, desplazamiento
def cambia_brillo(brillo: float):
"""Multiplica el valor RGB de cada pixel por el factor de brillo"""
for x in range(pixels.ancho):
for y in range(pixels.alto):
r, g, b = pixels.lee(x, y)
r = min(255, int(r * brillo))
g = min(255, int(g * brillo))
b = min(255, int(b * brillo))
pixels.pinta(x, y, (r, g, b))
def cambia_desplazamiento(desplazamiento: int):
"""Desplaza los valores RGB sumando o restando el desplazamiento indicado"""
for x in range(pixels.ancho):
for y in range(pixels.alto):
r, g, b = pixels.lee(x, y)
r = min(255, max(0, r + desplazamiento))
g = min(255, max(0, g + desplazamiento))
b = min(255, max(0, b + desplazamiento))
pixels.pinta(x, y, (r, g, b))
def main():
imagen, brillo, desplazamiento = lee_argumentos()
pixels.prepara(imagen)
cambia_brillo(brillo)
cambia_desplazamiento(desplazamiento)
pixels.espera()
if __name__ == "__main__":
main()
Análisis
Cumple con el enunciado
El programa cumple con los requisitos especificados:
- Lee correctamente los argumentos de la línea de comandos y valida su cantidad y tipo.
- Implementa
cambia_brillomultiplicando cada componente RGB por el factor y limitando a 255. - Implementa
cambia_desplazamientosumando el desplazamiento a cada componente RGB y ajustando entre 0 y 255. - La estructura de
main()coincide exactamente con la requerida, incluyendo el orden de aplicación de los efectos.
Es fácil de leer y entender
El código es comprensible para estudiantes principiantes:
- Usa nombres de variables y funciones claros en español.
- Incluye comentarios básicos que explican la funcionalidad.
- La lógica de los bucles y condicionales es directa y sin anidamientos excesivos.
- El manejo de errores en
lee_argumentoses adecuado, aunque podría mejorar la especificidad de los mensajes.
Sigue buenas prácticas de programación
El programa sigue buenas prácticas básicas:
- Divide la funcionalidad en funciones con responsabilidades claras.
- Valida los argumentos de entrada antes de procesar.
- Utiliza
sys.exit()para terminar en caso de errores de entrada. - Aplica las operaciones RGB de forma coherente en ambos efectos.
Recomendaciones de mejora
-
Validación más específica de argumentos:
- Actualmente, si falla la conversión de brillo o desplazamiento, muestra un mensaje general. Sería mejor identificar qué argumento falló:
try: brillo = float(sys.argv[2]) except ValueError: print("Error: El brillo debe ser un número real.") sys.exit(1) -
Manejo de decimales en brillo:
- Al multiplicar por un factor de brillo, truncar a
intpuede perder precisión. Considerar redondeo:
r = min(255, round(r * brillo)) - Al multiplicar por un factor de brillo, truncar a
-
Evitar repetición en desplazamiento:
- La lógica de ajuste de valores (0-255) se repite 3 veces. Podría crearse una función auxiliar:
def ajusta_valor(valor: int) -> int: return min(255, max(0, valor)) -
Comprobación de rangos en argumentos:
- Aunque el enunciado no lo exige, sería útil validar que el brillo es positivo (aunque el enunciado permite cualquier valor).
-
Documentación más detallada:
- Añadir docstrings completos a todas las funciones, explicando qué hacen y cómo operan.
-
Uso de
foranidados:- Para mejorar legibilidad, considerar intercambiar el orden de los bucles:
for y in range(pixels.alto): for x in range(pixels.ancho): -
Evitar conversiones innecesarias:
- En
cambia_brillo, después de multiplicar por un float,int()trunca directamente.round()daría resultados más precisos visualmente.
- En