Les compréhensions ont des interactions inattendues avec le scoping. Est-ce le comportement attendu ?
J'ai une méthode :
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
Au risque de pleurnicher, c'est une source brutale d'erreurs. Lorsque j'écris du nouveau code, je trouve de temps en temps des erreurs très bizarres dues au rebinding -- même maintenant que je sais que c'est un problème. J'ai besoin de faire une règle comme "toujours faire précéder les variables temp dans les compréhensions de liste avec un soulignement", mais même cela n'est pas infaillible.
Le fait qu'il y ait cette bombe à retardement aléatoire annule en quelque sorte toute la "facilité d'utilisation" des compréhensions de listes.
7 votes
-1 : "source brutale d'erreurs" ? Pas du tout. Pourquoi choisir un tel terme argumentatif ? En général, les erreurs les plus coûteuses sont les malentendus sur les exigences et les simples erreurs de logique. Ce type d'erreur a été un problème standard dans de nombreux langages de programmation. Pourquoi l'appeler "brutale" ?
48 votes
Il viole le principe de la moindre surprise. Il n'est pas non plus mentionné dans la documentation python sur les compréhensions de listes, qui mentionne pourtant plusieurs fois combien elles sont faciles et pratiques. En fait, il s'agit d'une mine qui existait en dehors de mon modèle de langage, et qu'il m'était donc impossible de prévoir.
37 votes
+1 pour "source brutale d'erreurs". Le mot "brutal" est entièrement justifiée.
3 votes
La seule chose "brutale" que je vois ici est votre convention de nommage. Nous ne sommes plus dans les années 80 et les noms de variables ne sont plus limités à 3 caractères.
7 votes
Note : la documentation fait affirment que la compréhension des listes est équivalente à l'explicite
for
-construire des boucles etfor
-Les boucles font fuir les variables . Ce n'était donc pas explicite mais c'était implicite.3 votes
@Bakuriu L'explicite est mieux que l'implicite.