Überprüfen ob key existiert klappt nicht

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
0815pascal
User
Beiträge: 7
Registriert: Montag 26. Januar 2009, 15:28

Hallo,

ich möchte zu Beginn überprüfen ob eine HTTP GET-Variable bereits existiert oder nicht. Ich tu das folgendermassen:

Code: Alles auswählen

try: self.request.get('key')
    except NameError:
        self.response.out.write('Schlecht')
    else:
        self.response.out.write('Gut')
Lustigerweise ist die Ausgabe immer "Gut". Auch wenn das Programm zum ersten Mail aufgerufen wird. ich blick da nicht durch, weshalb es angibt, dass "Key" existiert, obwohl es gar noch nicht existieren kann, da key erst im weiteren Ablauf des Programmes erstellt wird...
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Wenn ein Key nicht existiert, gibt es einen KeyError. Bei der get-Methode eines Dictionarys gibt es aber im Fehlerfall keinen KeyError; es wird dann None zurückgegeben.
0815pascal
User
Beiträge: 7
Registriert: Montag 26. Januar 2009, 15:28

derdon hat geschrieben:Wenn ein Key nicht existiert, gibt es einen KeyError. Bei der get-Methode eines Dictionarys gibt es aber im Fehlerfall keinen KeyError; es wird dann None zurückgegeben.
Sorry das versteh' ich jetzt nicht ganz. Bin Python-Anfänger...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

0815pascal hat geschrieben:
derdon hat geschrieben:Wenn ein Key nicht existiert, gibt es einen KeyError. Bei der get-Methode eines Dictionarys gibt es aber im Fehlerfall keinen KeyError; es wird dann None zurückgegeben.
Sorry das versteh' ich jetzt nicht ganz. Bin Python-Anfänger...
Was ist daran nicht zu verstehen? Hast Du in der Doku mal geguckt, was die .get() Methode macht?

Du willst wohl das hier haben:

Code: Alles auswählen

try:
    self.request['key']
except KeyError:
    self.response.out.write('Schlecht')
else:
    self.response.out.write('Gut')
Hier greift Python direkt auf den Eintrag "key" im Dictionary request zu. Existiert der nicht, wird eben ein KeyError geworfen - kein NameError!

Folgende Lösung wäre eine, die mit .get() auswertet, ob der Key existiert:

Code: Alles auswählen

if self.request.get("key"):
    self.response.out.write('Gut')
else:
    self.response.out.write('Schlecht')
Als Tipp: Arbeite das Tutorial durch! Dort werden die grundlegenden Datentypen erklärt.
Nocta
User
Beiträge: 290
Registriert: Freitag 22. Juni 2007, 14:13

Dazu will ich mal anmerken, dass die meisten Funktionen wahrscheinlich auch keine Fehler werfen, sondern diese schon innerhalb der Funktion behandeln und irgendetwas definiertes tun, wie zB None zurückzugeben.
Das kann man zum Beispiel an der startswith Methode sehen:

Code: Alles auswählen

>>> a = ""
>>> a.startswith("a")
False
>>> a[0] == "a"

Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    a[0] == "a"
IndexError: string index out of range
a[0] == "a" und a.startswith("a") machen das selbe, nur dass die Funktion startswith keinen Fehler wirft, weil es damit umgehen kann, dass der String leer ist.

(Wobei man anstatt a[0] auch a[0:1] schreiben könnte, beim Slicen wird kein Fehler geworfen :p)
0815pascal
User
Beiträge: 7
Registriert: Montag 26. Januar 2009, 15:28

Hyperion hat geschrieben:
0815pascal hat geschrieben:
derdon hat geschrieben:Wenn ein Key nicht existiert, gibt es einen KeyError. Bei der get-Methode eines Dictionarys gibt es aber im Fehlerfall keinen KeyError; es wird dann None zurückgegeben.
Sorry das versteh' ich jetzt nicht ganz. Bin Python-Anfänger...
Was ist daran nicht zu verstehen? Hast Du in der Doku mal geguckt, was die .get() Methode macht?

Du willst wohl das hier haben:

Code: Alles auswählen

try:
    self.request['key']
except KeyError:
    self.response.out.write('Schlecht')
else:
    self.response.out.write('Gut')
Hier greift Python direkt auf den Eintrag "key" im Dictionary request zu. Existiert der nicht, wird eben ein KeyError geworfen - kein NameError!

Folgende Lösung wäre eine, die mit .get() auswertet, ob der Key existiert:

Code: Alles auswählen

if self.request.get("key"):
    self.response.out.write('Gut')
else:
    self.response.out.write('Schlecht')
Als Tipp: Arbeite das Tutorial durch! Dort werden die grundlegenden Datentypen erklärt.
Besten Dank. Welches Tutorial meinst du genau? Gibt ja vielerorts Tutorials
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

0815pascal hat geschrieben: Besten Dank. Welches Tutorial meinst du genau? Gibt ja vielerorts Tutorials
Im Wiki steht dazu einiges:
[wiki]FAQ#WieFangeIchAlsEinsteigerAn[/wiki]

Ich meinte das offizielle, also das, was der Doku beiliegt:
http://docs.python.org/tutorial/index.html
Antworten