In Python è possibile scrivere else non solo dopo if, ma anche dopo i cicli for e while. Il corpo di else viene eseguito solo quando il ciclo si è concluso in modo "normale" — non tramite break. Questo consente di realizzare in modo elegante, ad esempio, la ricerca di un elemento.
Esempio:
for x in range(5): if x == 3: print('break!') break else: print('Il ciclo è terminato senza break') # non verrà eseguito
for x in range(5): if x == 10: break else: print('Il ciclo è terminato senza break') # verrà eseguito
Questa funzionalità è spesso utilizzata per "ricerche senza successo": se non è scattato il break, significa che l'elemento non è stato trovato.
Il blocco else del ciclo viene sempre eseguito se il ciclo è terminato? Cosa succede se il ciclo era vuoto?
Risposta: Sì, se non c'era il break, else verrà sempre eseguito, anche se il ciclo non è mai entrato nel corpo:
for x in []: print('niente') else: print('else!') # questo verrà stampato
Storia
Progetto: Parser di documenti.
Problema: Cercavano una chiave in una lista e dopo il ciclo impostavano un flag "not found" al di fuori di else. Di conseguenza, la rilevazione dell'elemento non funzionava correttamente se il break non si attivava.
Storia
Progetto: Generazione di token unici.
Problema: La logica di generazione del token dipendeva da un'uscita corretta tramite break, e else veniva erroneamente considerato un "caso speciale", anche se di fatto scattava nel 99% delle esecuzioni, il che rompeva la logica di autorizzazione degli utenti.
Storia
Progetto: Script di test per l'API di rete.
Problema: A causa di una comprensione errata di else dopo il while, lo utilizzavano per gestire i timeout, anche se il ciclo si era concluso non per break, e i timeout non venivano gestiti, il che portava a errori "silenziosi" nei test.