try/except statt verschachtelter ifs?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Dienstag 26. Februar 2008, 11:43

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 26. Februar 2008, 11:50

Wieso sollte es "tricksen" sein, wenn man die einfachste Möglichkeit nimmt? Hierzu am besten folgender Link:
[wiki]Allgemeine Begriffe#E[/wiki]

Stichwort: EAFP
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Dienstag 26. Februar 2008, 11:52

Solange es übersichtlicher is?

Ich iteriere ständig über getattr(foo, 'bar', []) ;)
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 26. Februar 2008, 12:28

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Dienstag 26. Februar 2008, 12:35

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 ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 26. Februar 2008, 12:40

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
BlackJack

Dienstag 26. Februar 2008, 12:47

Ich denke er sucht:

Code: Alles auswählen

for foo in d.get('bar', []):
    do_stuff(foo)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Dienstag 26. Februar 2008, 12:57

uhm...ja.
Danke :oops:
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Dienstag 26. Februar 2008, 13:02

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 :)
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 26. Februar 2008, 14:55

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Dienstag 26. Februar 2008, 15:06

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...
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 26. Februar 2008, 15:53

Du könntest sowas machen:

Code: Alles auswählen

if isinstance(x, tuple):
    ...
elif isinstance(x, basestring):
    ...
else:
    ...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Dienstag 26. Februar 2008, 19:12

aha ... :) DAS kannte ich jetzt auch noch nicht.

funktioniert :)
Antworten