Recibo un error clave en Python

191

En mi programa de Python obtengo este error:

KeyError: 'variablename'

De este código:

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

¿Alguien puede explicar por qué sucede esto?

David Liaw
fuente
11
Key errorgeneralmente significa keyque no existe. Entonces, ¿estás seguro de que existe el 'camino'?
RanRag
3
Imprima el contenido meta_entryy asegúrese de que la clave que desea existe.
Makoto

Respuestas:

263

A KeyErrorgeneralmente significa que la clave no existe. Entonces, ¿estás seguro de que la pathclave existe?

De los documentos oficiales de Python:

excepción KeyError

Se genera cuando no se encuentra una clave de mapeo (diccionario) en el conjunto de claves existentes.

Por ejemplo:

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

Por lo tanto, intente imprimir el contenido meta_entryy verifique si pathexiste o no.

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

O puedes hacer:

>>> 'a' in mydict
True
>>> 'c' in mydict
False
RanRag
fuente
hmm ... ¿cómo haría eso? (Perdón por ser un novato) La aplicación está alojada en el motor de aplicaciones de Google y no tengo acceso a ningún archivo que cree.
David Liaw
Tengo acceso a mi código pero ninguno de los códigos que crea o usa el motor
David Liaw
Entonces, el código que publicó path = meta_entry['path'].strip('/'),es parte de su código o del motor. Si es parte del motor, me temo que no se puede hacer nada.
RanRag
@lonehangman: que simplemente hacer print meta_entryy verificar si contiene patho no.
RanRag
Soy bastante nuevo en Python, ¿podría explicarlo con más detalle? Perdón por ser una plaga
David Liaw
128

Estoy totalmente de acuerdo con los comentarios de error clave. También puede usar el método get () del diccionario para evitar las excepciones. Esto también podría usarse para dar una ruta predeterminada en lugar de Nonecomo se muestra a continuación.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None
Adam Lewis
fuente
9
+1 para comentarios muy relevantes de .get (). Parece una buena aplicación del Python EAFP (más fácil pedir perdón que permiso) en lugar de LBYL (Look Before You Leap), que creo que es menos pitónico.
Niels Bom
32

Para dictar, solo use

if key in dict

y no use la búsqueda en la lista de claves

if key in dict.keys()

Esto último llevará más tiempo.

viento de tecla
fuente
5

Sí, lo más probable es que sea causado por una clave no existente.

En mi programa, utilicé setdefault para silenciar este error, por cuestiones de eficiencia. dependiendo de qué tan eficiente es esta línea

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

Soy nuevo en Python también. De hecho, lo acabo de aprender hoy. Así que perdóname por la ignorancia de la eficiencia.

En Python 3, también puedes usar esta función,

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

Se dice que nunca generará un error clave.

Glenn Yu
fuente
El método get es antiguo, creo que incluso los dictos 1.x lo tenían. Pero estoy seguro de que 2.7 ya lo tenía.
Jürgen A. Erhard
3

Esto significa que a su matriz le falta la clave que está buscando. Manejo esto con una función que devuelve el valor si existe o en su lugar devuelve un valor predeterminado.

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

Salida:

1
2
#default
Ben Sullins
fuente
77
Argh ... horrible, horrible código no pitónico. No escriba código PHP en Python: no es una matriz, es un diccionario (puede llamarlo hash, pero la matriz está lista). Y: los dictos ya tienen su función "keyCheck": en lugar de "keyCheck ('key1', myarray, '#default')" haría "mydict.get ('key1', '#default')"
Jürgen A Erhard
2

Recibí este error cuando estaba analizando dictcon anidado 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])

Rastrear:

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

Porque en el segundo ciclo debería ser cats[cat]justo cat(lo que es solo una clave)

Entonces:

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

Da

black
10
white
8
pbaranski
fuente
0

Por ejemplo, si este es un número:

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

Funciona perfectamente, pero si usas, por ejemplo:

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

no funciona porque su entrada devuelve la cadena '1'. Entonces necesitas usar int ()

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

Permítanos simplificarlo si está usando Python 3

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

Si necesitas otra condición

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

Para el valor de clave dinámica, también puede manejar a través del bloque 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'}
Muthu Kumar
fuente