Seite 1 von 1

Überprüfen ob key existiert klappt nicht

Verfasst: Dienstag 27. Januar 2009, 18:56
von 0815pascal
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...

Verfasst: Dienstag 27. Januar 2009, 19:20
von derdon
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.

Verfasst: Dienstag 27. Januar 2009, 20:00
von 0815pascal
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...

Verfasst: Dienstag 27. Januar 2009, 20:19
von Hyperion
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.

Verfasst: Dienstag 27. Januar 2009, 21:23
von Nocta
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)

Verfasst: Dienstag 27. Januar 2009, 21:59
von 0815pascal
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

Verfasst: Dienstag 27. Januar 2009, 22:05
von Hyperion
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