Recientemente he tropezado con una aparente incoherencia en la forma en que Python maneja las cláusulas else en diferentes declaraciones compuestas. Como Python está tan bien diseñado, estoy seguro de que hay una buena explicación, pero no puedo pensar en ello.¿Por qué otra cosa se comporta de manera diferente en las instrucciones for/while en comparación con las declaraciones if/try?
considerar lo siguiente:
if condition:
do_something()
else:
do_something_else()
Aquí, do_something_else()
sólo se ejecuta si condition
es falso, como se esperaba.
Del mismo modo, en
try:
do_something()
except someException:
pass:
else:
do_something_else()
finally:
cleanup()
do_something_else()
sólo se ejecuta si se ha producido no es una excepción.
Pero en los bucles while o while, siempre se ejecuta una cláusula else, independientemente de si el contenido de for/while block
se ha ejecutado o no.
for i in some_iterator:
print(i)
else:
print("Iterator is empty!")
siempre imprimirá "iterador está vacía!", Si digo some_iterator = []
o some_iterator = [1,2,3]
. Mismo comportamiento en while-else
cláusulas. Me parece que else
se comporta más como finally
en estos casos. ¿Qué estoy pasando por alto?
Me sorprende que Python permita la sintaxis. En la mayoría de los demás idiomas, se limita a usar solo con declaraciones if o switch. Los bucles For y los enunciados try pueden controlar el flujo, pero no son condicionales como un enunciado if, por lo que -else no tiene cabida en ellos. – shuckster
Por lo que vale, ha habido una larga discusión reciente de for/else, et al, en la lista de ideas de python, resumida aquí: http://article.gmane.org/gmane.comp.python.ideas/6131 /. El mismo Guido admite tener dudas al respecto: http://article.gmane.org/gmane.comp.python.ideas/6133/ –
¡Gracias por estos enlaces! –