Seite 1 von 1
try/except statt verschachtelter ifs?
Verfasst: Dienstag 26. Februar 2008, 11:43
von meneliel
Hallöchen,
ich bin gerade beim Schreiben von paar Funktionen irgendwie darauf gestoßen, dass ich ein Problem "leichter" und kürzer lösen lässte, wenn ich statt verzweigter Ifs einfach ein try/except benutze. (Dabei natürlich nur gezielt in dem Fall AttributeError).
Und hab da nun eher eine prinzipielle Frage:
Ist das so auch ganz koscher? Oder trickse ich mich auf die Art und Weise nur unsauber um ein Problem herum?
Verfasst: Dienstag 26. Februar 2008, 11:50
von Hyperion
Wieso sollte es "tricksen" sein, wenn man die einfachste Möglichkeit nimmt? Hierzu am besten folgender Link:
[wiki]Allgemeine Begriffe#E[/wiki]
Stichwort: EAFP
Verfasst: Dienstag 26. Februar 2008, 11:52
von audax
Solange es übersichtlicher is?
Ich iteriere ständig über getattr(foo, 'bar', [])

Verfasst: Dienstag 26. Februar 2008, 12:28
von EyDu
audax hat geschrieben:Ich iteriere ständig über getattr(foo, 'bar', [])

Du iterierst doch aber nicht über die Attirbutnamen, oder? Den Fall möchte ich sehen, bei dem ein Dictionary nicht die bessere Variante ist

Verfasst: Dienstag 26. Februar 2008, 12:35
von audax
ich werds evtl. nochmal umschreiben, ja....
wie schreibe ich den dann quasi
Code: Alles auswählen
try:
for foo in d['bar']:
do_stuff(foo)
except KeyError:
pass
in kurz?
Denn das wäre sogar mir etwas
zu explizit

Verfasst: Dienstag 26. Februar 2008, 12:40
von CM
Mal von der Einrückung abgesehen: Ich verstehe das nicht. Wenn 'bar' zu bar wird und eine "Variable" ist, dann kannst Du natürlich ggf. einen KeyError abfangen. Was mit foo in do_stuff() passiert ist dagegen do_stuff() überlassen, oder?
Worauf willst Du hinaus?
Gruß,
Christian
Verfasst: Dienstag 26. Februar 2008, 12:47
von BlackJack
Verfasst: Dienstag 26. Februar 2008, 12:57
von audax
uhm...ja.
Danke

Verfasst: Dienstag 26. Februar 2008, 13:02
von meneliel
Hyperion hat geschrieben:Wieso sollte es "tricksen" sein, wenn man die einfachste Möglichkeit nimmt? Hierzu am besten folgender Link:
[wiki]Allgemeine Begriffe#E[/wiki]
Stichwort: EAFP

okay
aber ... wenn die Ausnahme theoretisch nicht auftreten sollte, es aber vorkommt, okay.
Aber in diesem Fall, weiß ich, dass in einigen Fällen, und das ist auch richtig, dass das passiert, halt eben eine exception kommen wird.
Aber wenn das so okay ist, dann ist gut

Verfasst: Dienstag 26. Februar 2008, 14:55
von jens
Es ist auch ein Performance Sache.
Es lohnt sich vorher eine Abfrage zu machen, wenn eine Exception öfters vorkommt. Ist es ehr die Ausnahme, dann besser try...except.
z.B.:
Code: Alles auswählen
try:
mach_was_mit(bla[key])
except KeyError:
print "nicht da"
oder
Beides ist ok. Wenn der key aber sehr oft nicht da ist, macht die If Variante Sinn. Ist der Key normalerweise immer vorhanden, dann die try...except...
Wobei sich beide Varianten auch unterscheiden z.B. wenn in der Funktion mach_was_mit() ein KeyError vorkommt, der dort nicht abgefangen wurde.
Verfasst: Dienstag 26. Februar 2008, 15:06
von meneliel
ich wollte das ja zuerst mit nem if machen.... aber, wenn die Bedingung nicht erfüllt wird, gab es halt nen AttributError
Code: Alles auswählen
x = dict_A[0][key][1]
try:
x.startswith("_")
except AttributeError:
x = dict_A[0][key][1][0]
Also ... je nachdem welches dictionary gerade benutzt wird ist der benötigte value entweder nen string (das kommt häufiger vor), aber bei einem Ausnahmefall wird halt das 2. dictionary benutzt und dort steht der benötigte string halt in einem Tupel, auf das ich ja keine String-Operationen ausführen kann...
Verfasst: Dienstag 26. Februar 2008, 15:53
von jens
Du könntest sowas machen:
Code: Alles auswählen
if isinstance(x, tuple):
...
elif isinstance(x, basestring):
...
else:
...
Verfasst: Dienstag 26. Februar 2008, 19:12
von meneliel
aha ...

DAS kannte ich jetzt auch noch nicht.
funktioniert
