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 :D

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
Ich denke er sucht:

Code: Alles auswählen

for foo in d.get('bar', []):
    do_stuff(foo)

Verfasst: Dienstag 26. Februar 2008, 12:57
von audax
uhm...ja.
Danke :oops:

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

Code: Alles auswählen

if key in bla:
   mach_was_mit(bla[key])
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 :)