IIC2233 / Syllabus

143 stars 13 forks source link

AC1 Problema con test cases función animes_por_estreno #36

Closed Igufu closed 1 month ago

Igufu commented 1 month ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Problema

Saludos, tengo un problema respecto a la función animes_por_estreno(animes: list) -> dict: en la actividad 1. Cuando corro el test con el comando python3 -m unittest -v -b tests_publicos.test_consultas_animes_por_estreno o todos los test a la vez hay veces que la consola imprime failures=2,failures=1 o OK.

Específicamente el error viene del test test_resultado_varios_repetidos

AssertionError: {2016: ['Gintama', 'BnHA'], 2011: ['Chihiro', 'Amapolas'], 1998: ['Sakura']} != {1998: ['Sakura'], 2011: ['Chihiro', 'Amapolas'], 2016: ['BnHA', 'Gintama']}
- {1998: ['Sakura'], 2011: ['Chihiro', 'Amapolas'], 2016: ['Gintama', 'BnHA']}
?                                                                   --------

+ {1998: ['Sakura'], 2011: ['Chihiro', 'Amapolas'], 2016: ['BnHA', 'Gintama']}
?                                                          ++++++++. 

De manera de prueba corrí el código 100 veces y anoté los resultados en la siguente tabla:

Output times
Failures=2 63
Failures=1 7
OK 30

También me aseguré de correr el código en el path correcto (/Actividades/AC1) y de jamás editar los test cases.

Me parece un tanto extraño el error ya que en el enunciado dice que el orden de los animes dentro de las listas no importa:

imagen Estoy seguro de que es un error mío, una sospecha que tengo es que tal vez el error se genera de otra parte, tal vez con los types pero la verdad es que he estado varias horas tratando de arreglarlo y no puedo llegar a pasar los tests de forma consistente.


Gracias y disculpen las molestias! :)

ibuki thumbs up yipee

(unrelated gif)

Igufu commented 1 month ago

Ok he solucionado el problema rehaciendo la función desde 0, el problema pareció surgir o desde el desempaquetamiento de la namedtuple o desde el operador dict(). Dejare este Issue abierto ya que aún no estoy seguro cuál fue el problema original, y especialmente el hecho de que los testcases a veces daban bueno y a veces malo.

Hernan4444 commented 1 month ago

Hola @Igufu

Lo que pasa es que justamente ahí había un error por parte nuestra, donde se usó una forma de validar igualdad de diccionarios donde el orden de cada lista en el valor si importa, pero el enunciado es el que manda. Por lo tanto,

  1. Los tests privados van a tener en consideración este error para no fallar en caso que la lista de los animes cambie el orden.

  2. Se acaba de actualizar lo tests públicos para que ahora no afecte. Por lo tanto, te recomiendo hacer pull del repositorio para probar la nueva versión.

Sobre el error de que a veces funcionaba o a veces no, es que justamente hay ciertos comandos en Python que no son deterministas, es decir, no siempre van a dar el mismo resultado. Pero para poder explicar muuucho mejor el error, necesitaría ver la forma que hiciste ese comando. Por lo cual, si quieres entender bien el error, te pediríamos que pushees, en otro archivo (main_viejo.py por ejemplo) para ver cómo estaba programada la versión antigua, y así podemos ver en tu repositorio dicho archivo para dar mejor explicación.

Muchas gracias por noar esto. ¡Éxito con la actividad! 🦖 Saludosヾ(^-^)ノ

Igufu commented 1 month ago

Hola!

He subido un archivo llamado main_viejo.py a mí repositorio en - AC1/Test_issue una cosa a destacar es que no use la namedtuple de manera (cosa que estoy arreglando), tal vez el bug podría originarse por eso. Ahora mismo no estoy en mi casa por lo que no alcanze a poner anotaciones. Así que si el código es muy difícil de entender al llegar a mi casa le pongo anotaciones para que sea más comprensible.

Gracias! 🐧

Hernan4444 commented 1 month ago

Hola @Igufu

Revisé tu código y el tema es el uso de set y luego su transformación a una lista. En Python, los conjuntos (set) son colecciones desordenadas y no tienen un orden garantizado. Cuando transformas un set en una lista, el orden de los elementos en la lista puede no ser consistente porque los set no mantienen un orden fijo de los elementos.

El orden de los elementos en un set puede variar entre diferentes ejecuciones (como lo que te ocurrió a ti), o incluso entre diferentes ejecuciones de esa misma función dentro de una misma ejecución del programa. Por eso, en general si vas a transformar un set a una lista, nunca esperar que el orden se mantenga, ahí es recomendable explorar otras herramientas, por ejemplo, transformar a lista y luego aplicar un tipo de ordenamiento deterministico.

Espero que haya resuelto tu duda, en otro caso no dudes en preguntar. ¡Éxito con la actividad! 🦖 Saludosヾ(^-^)ノ

Igufu commented 1 month ago

Hola!

Gracias me quedo claro el error, la verdad tiene mucho más sentido de lo que pensaba.

Nuevamente agradezco la ayuda y espero que tenga un buen fin de semana!, ahora cerraré el issue.

typingcat
Hernan4444 commented 1 month ago

Hola @Igufu

Recuerda porfis que en las Reglas del foro (punto 8) es que no cierren la issue. Esto lo haremos nosotros 😁

🦖 Saludosヾ(^-^)ノ