Ich erhalte einen Schlüsselfehler in Python


189

In meinem Python-Programm wird folgende Fehlermeldung angezeigt:

KeyError: 'variablename'

Aus diesem Code:

path = meta_entry['path'].strip('/'),

Kann jemand bitte erklären, warum dies geschieht?


10
Key errorbedeutet im Allgemeinen, dass das keynicht existiert. Sind Sie sicher, dass es einen „Pfad“ gibt?
RanRag

3
Drucken Sie den Inhalt von meta_entryund stellen Sie sicher, dass der gewünschte Schlüssel vorhanden ist.
Makoto

Antworten:


258

A KeyErrorbedeutet im Allgemeinen, dass der Schlüssel nicht vorhanden ist. Sind Sie sicher, dass der pathSchlüssel vorhanden ist?

Aus den offiziellen Python-Dokumenten:

Ausnahme KeyError

Wird ausgelöst, wenn im Satz der vorhandenen Schlüssel kein Zuordnungsschlüssel (Wörterbuchschlüssel) gefunden wird.

Beispielsweise:

>>> mydict = {'a':'1','b':'2'}
>>> mydict['a']
'1'
>>> mydict['c']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'c'
>>>

Versuchen Sie also, den Inhalt von zu drucken meta_entryund zu überprüfen, ob er pathvorhanden ist oder nicht.

>>> mydict = {'a':'1','b':'2'}
>>> print mydict
{'a': '1', 'b': '2'}

Oder Sie können tun:

>>> 'a' in mydict
True
>>> 'c' in mydict
False

hmm ... wie würde ich das machen? (Entschuldigung, dass Sie ein Noob sind) Die App wird auf der Google App Engine gehostet und ich habe keinen Zugriff auf die von ihr erstellten Dateien.
David Liaw

Ich habe Zugriff auf meinen Code, aber keinen der Codes, die er erstellt oder die Engine verwendet
David Liaw

Der Code, den Sie veröffentlicht haben, path = meta_entry['path'].strip('/'),ist Teil Ihres Codes oder der Engine. Wenn es Teil des Motors ist, kann ich leider nichts tun.
RanRag

@lonehangman: als nur zu tun print meta_entryund zu überprüfen, ob es enthält pathoder nicht.
RanRag

Ich bin ziemlich neu in Python. Könnten Sie das bitte genauer erklären? Entschuldigung für die Schädlingsbekämpfung
David Liaw

127

Ich stimme den wichtigsten Fehlerkommentaren voll und ganz zu. Sie können auch die get () -Methode des Wörterbuchs verwenden , um die Ausnahmen zu vermeiden. Dies kann auch verwendet werden, um einen Standardpfad anzugeben, anstatt Nonewie unten gezeigt.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None

9
+1 für einen sehr relevanten .get () Kommentar. Sieht aus wie eine gute Anwendung des Python EAFP (leichter um Vergebung zu bitten als um Erlaubnis) anstelle von LBYL (Look Before You Leap), was meiner Meinung nach weniger pythonisch ist.
Niels Bom

32

Zum Diktieren einfach verwenden

if key in dict

und nicht verwenden

if key in dict.keys()

Es wird zeitaufwändig sein


5

Ja, es wird höchstwahrscheinlich durch einen nicht vorhandenen Schlüssel verursacht.

In meinem Programm habe ich setdefault verwendet, um diesen Fehler aus Effizienzgründen stummzuschalten. je nachdem wie effizient diese Linie ist

>>>'a' in mydict.keys()  

Ich bin auch neu in Python. Tatsächlich habe ich es heute gerade gelernt. Verzeihen Sie mir die Unkenntnis der Effizienz.

In Python 3 können Sie auch diese Funktion verwenden:

get(key[, default]) [function doc][1]

Es wird gesagt, dass es niemals einen Schlüsselfehler auslösen wird.


Die get-Methode ist uralt, ich denke sogar 1.x Diktate hatten es. Aber ich bin sicher, 2.7 hatte es schon.
Jürgen A. Erhard

3

Dies bedeutet, dass Ihrem Array der gesuchte Schlüssel fehlt. Ich behandle dies mit einer Funktion, die entweder den Wert zurückgibt, falls vorhanden, oder stattdessen einen Standardwert zurückgibt.

def keyCheck(key, arr, default):
    if key in arr.keys():
        return arr[key]
    else:
        return default


myarray = {'key1':1, 'key2':2}

print keyCheck('key1', myarray, '#default')
print keyCheck('key2', myarray, '#default')
print keyCheck('key3', myarray, '#default')

Ausgabe:

1
2
#default

7
Argh ... schrecklicher, schrecklicher unpythonischer Code. Schreiben Sie keinen PHP-Code in Python: Es ist kein Array, es ist ein Wörterbuch (Sie können es als Hash bezeichnen, aber das Array ist richtig). Und: Diktate haben bereits Ihre "keyCheck" -Funktion: Anstelle von "keyCheck ('key1', myarray, '#default')" würden Sie "mydict.get ('key1', '#default')"
Jürgen A

2

Ich habe diesen Fehler erhalten, als ich dictmit verschachtelt analysiert habe for:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cat:
        print(cats[cat][attr])

Zurück verfolgen:

Traceback (most recent call last):
      File "<input>", line 3, in <module>
    KeyError: 'K'

Denn in der zweiten Schleife sollte cats[cat]stattdessen nur sein cat(was ist nur ein Schlüssel)

So:

cats = {'Tom': {'color': 'white', 'weight': 8}, 'Klakier': {'color': 'black', 'weight': 10}}
cat_attr = {}
for cat in cats:
    for attr in cats[cat]:
        print(cats[cat][attr])

Gibt

black
10
white
8

0

Wenn dies beispielsweise eine Zahl ist:

ouloulou={
    1:US,
    2:BR,
    3:FR
    }
ouloulou[1]()

Es funktioniert perfekt, aber wenn Sie zum Beispiel verwenden:

ouloulou[input("select 1 2 or 3"]()

Es funktioniert nicht, weil Ihre Eingabe die Zeichenfolge '1' zurückgibt. Sie müssen also int () verwenden

ouloulou[int(input("select 1 2 or 3"))]()

0

Lassen Sie es uns einfach machen, wenn Sie Python 3 verwenden

mydict = {'a':'apple','b':'boy','c':'cat'}
check = 'c' in mydict
if check:
    print('c key is present')

Wenn Sie eine andere Bedingung benötigen

mydict = {'a':'apple','b':'boy','c':'cat'}
if 'c' in mydict:
    print('key present')
else:
    print('key not found')

Für den dynamischen Schlüsselwert können Sie auch den Try-Exception-Block verarbeiten

mydict = {'a':'apple','b':'boy','c':'cat'}
try:
    print(mydict['c'])
except KeyError:
    print('key value not found')mydict = {'a':'apple','b':'boy','c':'cat'}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.