Ich habe eine Funktion, die eines von drei Dingen zurückgeben kann:
- Erfolg (
True
) - Fehler (
False
) - Fehler beim Lesen / Parsen von Stream (
None
)
Meine Frage ist, ob ich nicht gegen True
oder testen soll False
, wie ich das Ergebnis sehen soll. Unten ist, wie ich es gerade mache:
result = simulate(open("myfile"))
if result == None:
print "error parsing stream"
elif result == True: # shouldn't do this
print "result pass"
else:
print "result fail"
Ist es wirklich so einfach wie das Entfernen des == True
Teils oder sollte ich einen Tri-Bool-Datentyp hinzufügen? Ich möchte nicht, dass die simulate
Funktion eine Ausnahme auslöst, da das äußere Programm nur einen Fehler protokollieren und fortfahren soll.
simulate
Funktion fange ich alle Ausnahmen ab; Ich möchte nicht, dass irgendetwas, das im Simulator passiert, den Rest des Programms stoppt (und das nächste Element verarbeitet). Aber die Antworten bringen mich dazu, meine Meinung zu ändern.simulate
Dinge haben, die es fangen und erneut versuchen kann, ist das gut. Aber wenn es "fehlschlägt", sollte es nicht zurückkehrenNone
. Es sollte nur eine Ausnahme zu dem Skript auslösen, das es aufgerufen hat. So oder sosimulate
ist es geschafft. Die RückgabeNone
ist nicht so hilfreich wie das Auslösen einer richtigen Ausnahme - oder das Weitergeben einer Ausnahmesimulate
in das aufrufende Skript zur Behandlung.except Exception:
stattdessen. Dies fängt alle "echten" Fehler zusammen mitWarning
und abStopIteration
. Es erlaubtKeyboardInterrupt
undSystemExit
durch. Wenn Sie diese wirklich fangen möchten, ist es wahrscheinlich am besten, einen anderen äußeren Versuch / eine andere Struktur zu verwenden, die Ihre Absicht klar dokumentiert, da dies keine "Fehler" sind. (Aber ich habe "fast nie" gesagt ... vielleicht möchten Sie in Ihrem Fall wirklich alles ergreifen und sogar Strg-C verhindern oder dassys.exit()
Verlassen beenden usw.)Antworten:
Fürchte die Ausnahme nicht! Wenn Sie Ihr Programm nur protokollieren und fortfahren, ist dies so einfach wie:
Und jetzt können Sie mit der Simulationsmethode eine viel umfangreichere Art der Benachrichtigung darüber erhalten, was genau schief gelaufen ist, falls Sie feststellen, dass Fehler / kein Fehler nicht informativ genug sind.
quelle
traceback.format_exc()
. Siehe diese SO-Antwort.halte es einfach und explizit. Sie können natürlich ein Wörterbuch vordefinieren.
Wenn Sie vorhaben, Ihre
simulate
Funktion so zu ändern, dass sie mehr Rückkehrcodes enthält, kann die Pflege dieses Codes zu einem Problem werden.Dies
simulate
könnte auch eine Ausnahme für den Parsing-Fehler auslösen. In diesem Fall würden Sie ihn entweder hier abfangen oder eine Stufe höher verbreiten lassen, und das Druckbit würde auf eine einzeilige if-else-Anweisung reduziert.quelle
Niemals, niemals, niemals sagen
Noch nie. Es ist verrückt, da Sie redundant wiederholen, was redundant als redundante Bedingungsregel für eine if-Anweisung angegeben ist.
Schlimmer noch, niemals, niemals, niemals
Du hast
not
. Fühlen Sie sich frei, es zu benutzen.Schließlich ist das Tun
a == None
ineffizient. Tu esa is None
.None
ist ein spezielles Singleton-Objekt, es kann nur eines geben. Überprüfen Sie einfach, ob Sie dieses Objekt haben.quelle
True
ist nicht überflüssig (obwohl ich damit einverstanden bin, dass es nicht sinnvoll ist). Es könnte sich um eine__eq__
oder eine andere spezielle Methode handeln, die praktisch alles kann.if something == True
die ein anderes Ergebnis liefern alsif something
z. B. für nicht-booleschesomething
.2==True
ergibt false, während2
true bewertet wird;None==False
ist falsch abernot None
ist wahr!something
RückgabeTrue
aufbool(something)
. In diesem Fall , wenn Sie überprüfen möchten , obsomething
einen Wert vonTrue
zBbool
. Dann musst duif something == True
IMO machen.Ich möchte betonen, dass, selbst wenn es Situationen gibt, in denen dies
if expr :
nicht ausreicht, weil man sicherstellen möchte, dassexpr
esTrue
nicht nur anders ist als0
/None
/ was auch immer,is
es aus==
dem gleichen Grund vorzuziehen ist, den S.Lott zur Vermeidung erwähnt hat== None
.Es ist in der Tat etwas effizienter und, menschlich lesbar, besser lesbar.
quelle
Ich glaube, dass das Auslösen einer Ausnahme eine bessere Idee für Ihre Situation ist. Eine Alternative ist die Simulationsmethode, um ein Tupel zurückzugeben. Der erste Punkt ist der Status und der zweite das Ergebnis:
quelle
False
zurückgegeben wird, wird er gedruckt'error parsing stream'
.