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?

David Liaw
quelle
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
RanRag
quelle
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
Adam Lewis
quelle
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

Schlüsselwind
quelle
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.

Glenn Yu
quelle
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
Ben Sullins
quelle
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
pbaranski
quelle
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"))]()
lemoinemeddy
quelle
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'}
Muthu Kumar
quelle