Niedawno natknąłem się na pozorną niekonsekwencję w sposobie radzenia sobie z innymi klauzulami Pythona w różnych złożonych stwierdzeniach. Ponieważ Python jest tak dobrze zaprojektowany, jestem pewien, że istnieje dobre wytłumaczenie, ale nie mogę o tym myśleć.Dlaczego zachowuje się inaczej w instrukcjach for/while, a nie w instrukcjach if/try?
Rozważmy następujący:
if condition:
do_something()
else:
do_something_else()
Tutaj do_something_else()
jest wykonywana tylko wtedy, gdy condition
jest fałszywa, jak oczekiwano.
Podobnie w
try:
do_something()
except someException:
pass:
else:
do_something_else()
finally:
cleanup()
do_something_else()
jest wykonywany tylko wtedy, gdy nie nastąpiło wyłączenie.
Jednak w pętlach for lub while zawsze wykonywana jest klauzula else, niezależnie od tego, czy zawartość for/while block
została wykonana, czy nie.
for i in some_iterator:
print(i)
else:
print("Iterator is empty!")
zawsze będzie drukować "Iterator jest pusty!", Czy mówię some_iterator = []
lub some_iterator = [1,2,3]
. To samo zachowanie w klauzulach while-else
. Wydaje mi się, że w takich przypadkach else
zachowuje się bardziej jak finally
. Co ja przeoczyłem?
Jestem zaskoczony Python pozwala na składnię. W większości innych języków -else jest ograniczone do używania tylko z instrukcjami if lub switch. For-loops i try-instrukcje mogą kontrolować przepływ, ale nie są warunkowe, jak instrukcja if, więc nie ma w nich miejsca. – shuckster
Na ile jest to warte, ostatnio prowadzono dyskusję na temat/else i innych na liście pomysłów Pythona, podsumowanej tutaj: http://article.gmane.org/gmane.comp.python.ideas/6131 /. Sam Guido przyznaje, że o tym myśli: http://article.gmane.org/gmane.comp.python.ideas/6133/ –
Dzięki za te linki! –