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"
Soweit ich weiß wird, sollte eine Funktion immer den gleichen Objekttyp zurückgeben (auch wenn es nicht benötigt). – ettanany
@ettanany Nein sollte es nicht. Aber es geht besser. – DyZ
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