Las listas de comprensión están teniendo interacciones inesperadas con el alcance. Es este el comportamiento esperado?Los nombres de la lista de Python reencuentran nombres incluso después del alcance de la comprensión. ¿Es esto correcto?
Tengo un método:
def leave_room(self, uid):
u = self.user_by_id(uid)
r = self.rooms[u.rid]
other_uids = [ouid for ouid in r.users_by_id.keys() if ouid != u.uid]
other_us = [self.user_by_id(uid) for uid in other_uids]
r.remove_user(uid) # OOPS! uid has been re-bound by the list comprehension above
# Interestingly, it's rebound to the last uid in the list, so the error only shows
# up when len > 1
A riesgo de lloriqueo, esto es una fuente brutal de errores. A medida que escribo el nuevo código, de vez en cuando encuentro errores muy extraños debido a una nueva vinculación, incluso ahora que sé que es un problema. Necesito hacer una regla como "preceder siempre a las variables temporales en listas de comprensión con guiones bajos", pero incluso eso no es infalible.
El hecho de que exista esta especie de bomba de tiempo aleatoria en cierto modo anula toda la agradable "facilidad de uso" de las listas de comprensión.
-1: "fuente brutal de errores"? Apenas. ¿Por qué elegir un término tan argumentativo? En general, los errores más costosos son malentendidos de los requisitos y errores lógicos simples. Este tipo de error ha sido un problema estándar en muchos lenguajes de programación. ¿Por qué llamarlo 'brutal'? –
Viola el principio de menor sorpresa. Tampoco se menciona en la documentación de Python sobre listas de comprensión, pero sí menciona varias veces lo fácil y conveniente que es. Esencialmente es una mina terrestre que existía fuera de mi modelo de lenguaje, y por lo tanto era imposible de prever. –
+1 por "fuente brutal de errores". La palabra "brutal" está * completamente * justificada. – Nathaniel