Jaki jest najlepszy sposób na wyjście z funkcji (która nie zwraca wartości) w Pythonie przed zakończeniem funkcji (np. Sprawdzenie nie powiedzie się)?


164

Załóżmy iterację, w której wywołujemy funkcję bez zwracanej wartości. Sposób, w jaki moim zdaniem powinien zachowywać się mój program, jest wyjaśniony w tym pseudokodzie:

for element in some_list:
    foo(element)

def foo(element):
    do something
    if check is true:
        do more (because check was succesful)
    else:
        return None
    do much much more...

Jeśli zaimplementuję to w Pythonie, przeszkadza mi, że funkcja zwraca plik None. Czy istnieje lepszy sposób na „wyjście z funkcji, która nie zwraca wartości, jeśli sprawdzenie nie powiedzie się w treści funkcji”?


6
Python zawsze zwraca wartość None, jeśli nie zwrócisz czegoś jawnie. Ale możesz zostawić opcję Brak.
Keith

2
W zależności od tego, jaki jest czek, możesz również raisewyjątek (lub, bardzo rzadko, sprawić, że funkcja zwróci True / False)
Rosz Oksymoron

Odpowiedzi:


278

Możesz po prostu użyć

return

który robi dokładnie to samo, co

return None

Twoja funkcja zwróci również wartość, Nonejeśli wykonanie dotrze do końca jej treści bez uderzenia w returninstrukcję. Zwracanie niczego jest tym samym, co zwracanie Nonew Pythonie.


returnnie działa, jeśli a = method()ustawię metodę, której używam return, nadal będzie wykonywał kod za plikiem. exit powinno wyglądać jak php exit (), natychmiast przerywa działanie programu.
TomSawyer

2
@TomSawyer, aby zatrzymać program w języku Python wcześniej, zrób import sysnajpierw, a następnie, sys.exit()jeśli chcesz zakończyć, ale zgłoś sukces lub sys.exit("some error message to print to stderr").
Boris

@Boris, to jest to, czego szukałem i to zadziałało.
mikey

17

Sugerowałbym:

def foo(element):
    do something
    if not check: return
    do more (because check was succesful)
    do much much more...

13

możesz użyć returninstrukcji bez żadnego parametru, aby wyjść z funkcji

def foo(element):
    do something
    if check is true:
        do more (because check was succesful)
    else:
        return
    do much much more...

lub zgłoś wyjątek, jeśli chcesz być poinformowany o problemie

def foo(element):
    do something
    if check is true:
        do more (because check was succesful)
    else:
        raise Exception("cause of the problem")
    do much much more...
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.