Ricevo un errore chiave in Python


191

Nel mio programma Python ricevo questo errore:

KeyError: 'variablename'

Da questo codice:

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

Qualcuno può spiegare perché questo sta accadendo?


11
Key errorgeneralmente significa keyche non esiste. Quindi, sei sicuro che esista un 'percorso'?
RanRag

3
Stampa il contenuto meta_entrye assicurati che esista la chiave desiderata.
Makoto,

Risposte:


263

In KeyErrorgenere significa che la chiave non esiste. Quindi, sei sicuro che la pathchiave esista?

Dai documenti ufficiali di Python:

eccezione KeyError

Generato quando una chiave di mappatura (dizionario) non viene trovata nel set di chiavi esistenti.

Per esempio:

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

Quindi, prova a stampare il contenuto di meta_entrye controlla se pathesiste o no.

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

Oppure puoi fare:

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

hmm ... come lo farei? (Ci scusiamo per essere un noob) L'app è ospitata su Google App Engine e non ho accesso ai file che crea.
David Liaw,

Ho accesso al mio codice, ma nessuno del codice che crea o utilizza il motore
David Liaw,

Quindi, il codice che hai pubblicato path = meta_entry['path'].strip('/'),fa parte del tuo codice o del motore. Se fa parte del motore, temo che non si possa fare nulla.
RanRag

@lonehangman: basta fare print meta_entrye controllare se contiene patho meno.
RanRag

Sono abbastanza nuovo per Python, potresti spiegarlo per favore con maggiori dettagli.
Ci

128

Sono pienamente d'accordo con i commenti sull'errore chiave. È inoltre possibile utilizzare il metodo get () del dizionario per evitare le eccezioni. Questo potrebbe anche essere usato per fornire un percorso predefinito piuttosto che Nonecome mostrato di seguito.

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

9
+1 per un commento .get () molto pertinente. Sembra una buona applicazione di Python EAFP (Più facile chiedere perdono che autorizzazione) invece di LBYL (Look Before You Leap) che penso sia meno Pythonic.
Niels Bom

32

Per dict, basta usare

if key in dict

e non usare la ricerca nell'elenco chiavi

if key in dict.keys()

Quest'ultimo richiederà più tempo.


5

Sì, molto probabilmente è causato da una chiave inesistente.

Nel mio programma, ho usato setdefault per silenziare questo errore, per motivi di efficienza. a seconda di quanto sia efficiente questa linea

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

Sono nuovo anche per Python. In effetti l'ho appena imparato oggi. Quindi perdonami per l'ignoranza dell'efficienza.

In Python 3, puoi anche usare questa funzione,

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

Si dice che non genererà mai un errore chiave.


Il metodo get è antico, penso che anche 1 dicts abbia avuto. Ma sono sicuro che 2.7 ce l'aveva già.
Jürgen A. Erhard,

3

Ciò significa che nell'array manca la chiave che stai cercando. Lo gestisco con una funzione che restituisce il valore se esiste o restituisce invece un valore predefinito.

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')

Produzione:

1
2
#default

7
Argh ... orribile, orribile codice non pitonico. Non scrivere codice PHP in Python: non è un array, è un dizionario (puoi chiamarlo hash, ma l'array è subito disponibile). E: dicts ha già la tua funzione "keyCheck": invece di "keyCheck ('key1', myarray, '#default')" faresti "mydict.get ('key1', '#default')"
Jürgen A Erhard,

2

Ho ricevuto questo errore durante l'analisi dictcon nidificato 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])

Rintracciare:

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

Perché nel secondo ciclo dovrebbe essere cats[cat]invece solo cat(ciò che è solo una chiave)

Così:

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])

black
10
white
8

0

Ad esempio, se questo è un numero:

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

Funziona perfettamente, ma se usi ad esempio:

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

non funziona perché l'input restituisce la stringa '1'. Quindi devi usare int ()

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

0

Rendiamolo semplice se stai usando Python 3

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

Se hai bisogno di altre condizioni

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

Per il valore della chiave dinamica, puoi anche gestire il blocco try-exception

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'}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.