Seite 1 von 1

KeyError abfangen

Verfasst: Dienstag 4. März 2008, 17:45
von Tekl
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

Verfasst: Dienstag 4. März 2008, 17:50
von Tekl
Sorry, hab's selber gefunden:

Code: Alles auswählen

if result.has_key('test'):

Verfasst: Dienstag 4. März 2008, 17:51
von Leonidas
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.

Verfasst: Dienstag 4. März 2008, 18:51
von Y0Gi
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.

Verfasst: Dienstag 4. März 2008, 19:19
von numerix
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.

Verfasst: Dienstag 4. März 2008, 20:04
von Leonidas
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.

Verfasst: Dienstag 4. März 2008, 20:10
von numerix
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?

Verfasst: Dienstag 4. März 2008, 20:51
von Leonidas
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.

Verfasst: Mittwoch 5. März 2008, 11:02
von Tekl
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.

Verfasst: Mittwoch 5. März 2008, 17:36
von Y0Gi
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.