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?
try/except statt verschachtelter ifs?
Du iterierst doch aber nicht über die Attirbutnamen, oder? Den Fall möchte ich sehen, bei dem ein Dictionary nicht die bessere Variante istaudax hat geschrieben:Ich iteriere ständig über getattr(foo, 'bar', [])
ich werds evtl. nochmal umschreiben, ja....
wie schreibe ich den dann quasi
in kurz?
Denn das wäre sogar mir etwas zu explizit
wie schreibe ich den dann quasi
Code: Alles auswählen
try:
for foo in d['bar']:
do_stuff(foo)
except KeyError:
pass
Denn das wäre sogar mir etwas zu explizit
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
Worauf willst Du hinaus?
Gruß,
Christian
Ich denke er sucht:
Code: Alles auswählen
for foo in d.get('bar', []):
do_stuff(foo)
okayHyperion 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
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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.:
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.
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"
Code: Alles auswählen
if key in bla:
mach_was_mit(bla[key])
Wobei sich beide Varianten auch unterscheiden z.B. wenn in der Funktion mach_was_mit() ein KeyError vorkommt, der dort nicht abgefangen wurde.
ich wollte das ja zuerst mit nem if machen.... aber, wenn die Bedingung nicht erfüllt wird, gab es halt nen AttributError
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...
Code: Alles auswählen
x = dict_A[0][key][1]
try:
x.startswith("_")
except AttributeError:
x = dict_A[0][key][1][0]
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Du könntest sowas machen:
Code: Alles auswählen
if isinstance(x, tuple):
...
elif isinstance(x, basestring):
...
else:
...
aha ... DAS kannte ich jetzt auch noch nicht.
funktioniert
funktioniert