Dies ist weniger eine Frage der Art der Ententypisierung als vielmehr der Frage, ob man pythonisch bleibt, nehme ich an.
Zuallererst - wenn es um Dikte geht, insbesondere wenn die Struktur des Diktats ziemlich vorhersehbar ist und ein bestimmter Schlüssel normalerweise nicht vorhanden ist, manchmal aber vorhanden ist, denke ich zuerst an zwei Ansätze:
if myKey in dict:
do_some_work(dict[myKey])
else:
pass
Und natürlich Ye Olde 'Vergebung gegen Erlaubnis' Ansatz.
try:
do_some_work(dict[myKey])
except KeyError:
pass
Als ein geselliger Python-Typ habe ich das Gefühl, dass ich sehe, dass Letzterer viel bevorzugt wird, was sich wohl nur seltsam anfühlt, weil die Python-Dokumente try/exceptsbevorzugt zu sein scheinen, wenn ein tatsächlicher Fehler vorliegt, im Gegensatz zu einem, ähm, fehlenden Erfolg?
Wenn das gelegentliche Diktat keinen Schlüssel in myDict hat und bekannt ist , dass es diesen Schlüssel nicht immer hat, ist ein Versuch / außer in Bezug auf den Kontext irreführend? Dies ist kein Programmierfehler, es ist nur eine Tatsache der Daten - dieses Diktat hatte nur diesen bestimmten Schlüssel nicht.
Dies scheint besonders wichtig zu sein, wenn Sie sich die try / except / else-Syntax ansehen, die sehr nützlich ist, um sicherzustellen, dass try nicht zu viele Fehler abfängt. Sie können Folgendes tun:
try:
foo += bar
except TypeError:
pass
else:
return some_more_work(foo)
Wird das nicht dazu führen, dass alle möglichen seltsamen Fehler verschluckt werden, die wahrscheinlich auf einen schlechten Code zurückzuführen sind? Der obige Code verhindert möglicherweise, dass Sie sehen, dass Sie versuchen, etwas hinzuzufügen, 2 + {}und Sie werden möglicherweise nie bemerken, dass ein Teil Ihres Codes fürchterlich schief gelaufen ist. Ich schlage nicht vor, dass wir All The Types überprüfen, deshalb ist es Python und nicht JavaScript - aber auch im Kontext von try / except scheint es so, als ob es das Programm dazu bringen soll, etwas zu tun, was es nicht tun sollte, stattdessen zu ermöglichen, weiterzumachen.
Mir ist klar, dass das obige Beispiel so etwas wie ein Strohmann-Argument ist und tatsächlich absichtlich schlecht ist. Aber angesichts des pythonischen Glaubens better to ask forgiveness than permissionkann ich nicht anders, als das Gefühl zu haben, dass sich die Frage stellt, wo die Grenze zwischen der korrekten Anwendung von if / else und try / except liegt, insbesondere wenn Sie wissen, was Sie erwartet die Daten, mit denen Sie arbeiten.
Ich spreche hier nicht einmal von Geschwindigkeitsproblemen oder Best Practices. Ich bin nur ein bisschen verwirrt von dem Venn-Diagramm, in dem es so aussieht, als ob es in beide Richtungen gehen könnte, aber die Leute irren sich auf der Seite eines Versuchs / einer Ausnahme weil 'irgendwo jemand gesagt hat, es sei Pythonic'. Habe ich falsche Schlussfolgerungen bezüglich der Anwendung dieser Syntax gezogen?