2016-12-04 2 views
0

Ich sehe viele gute Ratschläge darüber, wie man mehrere Werte in einer Funktion zurückgibt, aber was ist die bevorzugte Methode, um auch andere Rückmeldungen wie False zu prüfen?Python gibt mehrere Werte zurück und prüft auf Rückgabe False

Zum Beispiel:

def f(): 
    if condition1: 
     return False 
    else: 
     return x, y, z 

x, y, z = f() 

Ich kann if [x, y, z] is not None: überprüfen aber wie wäre es auch für False Überprüfung? Ist es nur if [x, y, z] is not None and f() is not False: oder gibt es einen besseren Weg?

+0

Soweit ich weiß wird, sollte eine Funktion immer den gleichen Objekttyp zurückgeben (auch wenn es nicht benötigt). – ettanany

+0

@ettanany Nein sollte es nicht. Aber es geht besser. – DyZ

+0

Deshalb habe ich gesagt "auch wenn es nicht benötigt wird". In anderen Programmiersprachen wird sogar der Rückgabewerttyp in der Funktionsdefinition erwähnt. – ettanany

Antwort

5

Wenn Sie in der unglücklichen Situation, wo Sie müssen befassen sich mit einer Funktion, die sich wie die, die Sie präsentiert, eine klare Möglichkeit, damit umzugehen ist mit einer try: Aussage.

try: 
    x, y, z = f() 
except TypeError: 
    <handle the situation where False was returned> 

Dies funktioniert, weil versucht False auszupacken eine TypeError wirft.


Wenn Sie können die Funktion ändern, ich könnte argumentieren, dass die idiomatische Strategie einen Fehler zu erhöhen wäre (entweder eingebaute oder benutzerdefinierte) statt False zurückzukehren.

def f(): 
    if condition1: 
     raise ValueError('Calling f() is invalid because condition1 evaluates to True') 
    return x, y, z 

try: 
    x, y, z = f() 
except ValueError: 
    <handle the situation where a tuple could not be returned> 

Dies hat den Vorteil, dass die wahre Natur des Fehlers in einem abgefangene Zurückverfolgungs zeigt eher als die weniger offensichtlich TypeError: 'bool' object is not iterable. Es hat auch den Vorteil, konsistente Rückgabetypen zu geben, so dass es keine Verwirrung seitens des Benutzers gibt.

Dokumentation wird viel auch klarer, weil statt

"in the case of success it will return a tuple of three elements, but in the case of failure it will return False (not as a tuple)" 

die Dokumentation

"returns a tuple of three elements; raises a ValueError on failure" 
2

das Ergebnis einer einzelnen Variablen zuweisen und prüfen, ob es falsch ist:

retval = f() 
if retval != False: 
    x,y,z = retval 
else: # False 
    ... 
+1

Ich downvoted wegen der Rückgabe drei 'False's Bit. Es ist redundant und kann Komplexität in einem Fall hinzufügen, wenn 'x, y, z 'jeweils sinnvolle boolesche Werte haben. –

+0

@YakymPirozhenko Guter Punkt. – DyZ

8

ich denke, es mehr Konsistenz helfen würde haben:

def f(): 
    if condition1: 
     return False, None 
    else: 
     return True, (x, y, z) 

success, tup = f() 
if success: 
    x, y, z = tup 
    # use x, y, z... 
Verwandte Themen