KeyError abfangen

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
Tekl
User
Beiträge: 7
Registriert: Dienstag 4. März 2008, 17:27

Hi,

wie kann ich prüfen, dass ein assoziatives array noch nicht belegt ist?

Code: Alles auswählen

result = {}
if result['test'] == "":
    print "leer"
else:
    print "voll"
Evtl hab ich's auch nur falsch verstanden. Ich komme auch eigentlich von PHP, aber das läuft bei mir gerade nicht und ich muss dringend was Skripten.

Tekl
Tekl
User
Beiträge: 7
Registriert: Dienstag 4. März 2008, 17:27

Sorry, hab's selber gefunden:

Code: Alles auswählen

if result.has_key('test'):
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Tekl, willkommen im Forum,

in Python ist ein nicht belegtes Element in einer Liste und ein leerer String nicht das gleiche. Schau dir doch mal das Tutorial an, dort steht alles zum Thema Exception-Handling was du wissen musst. Damit erübrigt sich auch eine Antwort auf deine Frage, weil du dir selbst antworten wirst können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Anstelle von `someDict.has_key('foo')` sollte man eher das zudem lesbarere `'foo' in someDict` verwenden. In Python heißt die Hashstruktur, die in PHP als assoziatives Array gehandelt wird, übrigens "Dictionary".

In Python ist übrigens der Ansatz "It's easier to ask for forgiveness than to ask for permission." gängig. So wird obiger Überprüfung vorgezogen, direkt auf den Wert zuzugreifen und einen `KeyError` eben abzufangen:

Code: Alles auswählen

try:
    print someDict['foo']
except KeyError:
    print 'Nicht gefunden.'
Grund/Vorteil: Eine vorhergehende Prüfung, die erfolgreich ist, kann im Moment des Zugriffs bereits nicht mehr aktuell sein, da z.B. in diesem Fall das Dictionary bereits verändert worden sein könnte.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Y0Gi hat geschrieben:Grund/Vorteil: Eine vorhergehende Prüfung, die erfolgreich ist, kann im Moment des Zugriffs bereits nicht mehr aktuell sein, da z.B. in diesem Fall das Dictionary bereits verändert worden sein könnte.
Grundsätzlich verstehe ich diesen Ansatz, aber ich verstehe nicht, wie sich im obigen Fall der Inhalt des dictionaries zwischen der Prüfung auf vorhandenen Schlüssel und der direkt darauf folgenden Ausgabe verändern soll.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

pütone hat geschrieben:Grundsätzlich verstehe ich diesen Ansatz, aber ich verstehe nicht, wie sich im obigen Fall der Inhalt des dictionaries zwischen der Prüfung auf vorhandenen Schlüssel und der direkt darauf folgenden Ausgabe verändern soll.
Stichwort Multithreading.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Leonidas hat geschrieben:Stichwort Multithreading.
Ist klar.
Aber wenn ich alles in einem Thread laufen lasse, spricht doch nichts dagegen, in einem Fall wie dem obigen VORHER zu prüfen und ohne exception-handling zu programmieren, oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

pütone hat geschrieben:Aber wenn ich alles in einem Thread laufen lasse, spricht doch nichts dagegen, in einem Fall wie dem obigen VORHER zu prüfen und ohne exception-handling zu programmieren, oder?
Naja, dann gibt es noch die Möglichkeit, dass sich die Datenstruktur unterdessen noch ändert. Also wenn zwischen dem Test und dem Code der Existenz des Elements vorraussetzt sich Code mit Seiteneffekten befindet. Dieser Code könnte durchaus die Struktur der Daten verändern. Kommt zwar relativ selten vor, aber denkbar.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Tekl
User
Beiträge: 7
Registriert: Dienstag 4. März 2008, 17:27

Danke für die weiteren Antworten. Ich kann bei meinem Skript eh nicht mit Threads arbeiten, da alles linear ablaufen muss. Jeder Aufgabe erfordert, dass vorhergehende abgeschlossen wurde.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

pütone hat geschrieben:Grundsätzlich verstehe ich diesen Ansatz, aber ich verstehe nicht, wie sich im obigen Fall der Inhalt des dictionaries zwischen der Prüfung auf vorhandenen Schlüssel und der direkt darauf folgenden Ausgabe verändern soll.
In dem konkreten Fall und auch vielen anderen mag sich das theoretisch nicht ändern können. Fälle, in denen das passiert, sind aber mehr als denkbar, nämlich alltäglich. Mit dem Abfangen einer Exception ist man *immer* auf der sicheren Seite, deshalb sollte man sich auch angewöhnen, immer so zu arbeiten. Dennoch kann der `in`-Operator auch in Fällen sinnvoll sein, in denen keine Exception geworfen würde.
Antworten