Le comprensioni delle liste hanno interazioni inaspettate con l'ambito. È questo il comportamento previsto?Nomi di riassociazione per la comprensione degli elenchi di Python anche dopo l'ambito della comprensione. È giusto?
Ho un metodo:
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 rischio di piagnucolare, questa è una fonte di errori brutale. Mentre scrivo un nuovo codice, di tanto in tanto trovo degli errori molto strani a causa del ribellarsi - anche ora che so che è un problema. Ho bisogno di fare una regola del tipo "sempre prefigura i vari del tempo nelle list comprehensions con underscore", ma anche questo non è infallibile.
Il fatto che ci sia questo tipo di bomba a tempo casuale in attesa nega tutta la piacevole "facilità d'uso" delle list comprehensions.
-1: "fonte brutale di errori"? Quasi. Perché scegliere un termine così argomentativo? Generalmente gli errori più costosi sono fraintendimenti dei requisiti e semplici errori logici. Questo tipo di errore è stato un problema standard in molti linguaggi di programmazione. Perché chiamarlo 'brutale'? –
viola il principio di minima sorpresa. Inoltre non è menzionato nella documentazione di Python sulla comprensione delle liste che tuttavia menziona più volte quanto siano semplici e comode. Essenzialmente è una miniera di terra che esisteva al di fuori del mio modello linguistico, e quindi era impossibile per me prevederlo. –
+1 per "fonte di errori brutali". La parola "brutale" è * interamente * giustificata. – Nathaniel