Mam złożony zestaw warunków, z których chciałbym wyjść, gdy tylko się spełni.
Do tego chciałbym użyć a try: / except:
struktura wokół nich, aby wyjść we właściwym czasie, co jest podobne do a goto
. Pogmatwany przykład (używając raise
do break
od while
) byłoby:
class Minor(Exception):
pass
class Major(Exception):
pass
age = 15
while True:
try:
if age > 18:
raise Major
else:
raise Minor
except Major:
print("major")
break
except Minor:
print("minor")
break
Czy takie użycie wyjątków pythonic? Innymi słowy: czy wyjątki miały na celu jedynie złapanie czegoś, co inaczej byłoby w przypadku Tracebacku, czy też mają one ogólne zastosowanie, jak wyżej?
EDYCJA: po komentarzach, chciałbym wyjaśnić, że nie patrzę, jak uprościć ten konkretny kawałek kodu - prawdziwy kod jest znacznie bardziej skomplikowany z zagnieżdżonymi pętlami i warunkami. Część, która mnie interesowała, to czy istnieją powody, by szczególnie zniechęcać do korzystania z wyjątków.
Odpowiedzi:
4 dla odpowiedzi № 1Nie, nie jest to podejście pytoniczne. Zwykłą metodą sterowania przepływem używaną do natychmiastowego wyjścia z zagnieżdżonych pętli jest umieszczenie logiki w funkcji i użycie znaku a return
komunikat.
PEP 3136 był kiedyś proponowany jako sposób na ucieczkę z zagnieżdżonych pętli za pomocą etykietowania break i continue:
Oznaczona przerwa i kontynuacja mogą poprawić czytelność i elastyczność złożonego kodu, który wykorzystuje zagnieżdżone pętle.
Ta metoda PEP została odrzucona dla Python 3.1. Guido napisał:
Odrzucam go na podstawie tak skomplikowanego kodu wymagają tej funkcji jest bardzo rzadkie. W większości przypadków istnieją obejścia, które zapewniają czysty kod, na przykład za pomocą "powrotu".