Recentemente ho incappato in un'apparente incoerenza nel modo in cui Python trattava altre clausole in diverse dichiarazioni composte. Dato che Python è così ben progettato, sono sicuro che c'è una buona spiegazione, ma non riesco a pensarci.Perché diversamente si comportano in modo diverso nelle istruzioni for/while rispetto alle istruzioni if / try?
Si consideri il seguente:
if condition:
do_something()
else:
do_something_else()
Qui, do_something_else()
viene eseguito solo se condition
è falso, come previsto.
Analogamente, in
try:
do_something()
except someException:
pass:
else:
do_something_else()
finally:
cleanup()
do_something_else()
viene eseguita solo se si è verificata un'eccezione.
In cicli for o while, viene sempre eseguita una clausola else, indipendentemente dal fatto che il contenuto di for/while block
sia stato eseguito o meno.
for i in some_iterator:
print(i)
else:
print("Iterator is empty!")
sarà sempre print "Iterator è vuoto!", Se io dico some_iterator = []
o some_iterator = [1,2,3]
. Stesso comportamento nelle clausole while-else
. Mi sembra che else
si comporti più come finally
in questi casi. Cosa sto trascurando?
Sono sorpreso che Python consenta la sintassi. Nella maggior parte degli altri linguaggi -else è limitato a essere utilizzato solo con if- o istruzioni switch. For-loops e try-statement potrebbero controllare il flusso, ma non sono condizionali come un'istruzione if, quindi -else non ha posto in essi. – shuckster
Per quello che vale, c'è stata una lunga discussione lunga su/else, et al, sulla lista delle idee python, riassunta qui: http://article.gmane.org/gmane.comp.python.ideas/6131 /. Lo stesso Guido ammette di avere ripensamenti al riguardo: http://article.gmane.org/gmane.comp.python.ideas/6133/ –
Grazie per questi link! –