Estou recebendo erro de chave em python

190

No meu programa python, estou recebendo este erro:

KeyError: 'variablename'

Deste código:

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

Alguém pode explicar por que isso está acontecendo?

David Liaw
fonte
10
Key errorgeralmente significa keyque não existe. Então, você tem certeza de que existe um 'caminho'?
RanRag
3
Imprima o conteúdo meta_entrye verifique se a chave que você deseja existe.
Makoto

Respostas:

258

A KeyErrorsignifica em geral a chave não existe. Então, você tem certeza que a pathchave existe?

Dos documentos oficiais do python:

exceção KeyError

Gerado quando uma chave de mapeamento (dicionário) não é encontrada no conjunto de chaves existentes.

Por exemplo:

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

Portanto, tente imprimir o conteúdo meta_entrye verifique se pathexiste ou não.

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

Ou você pode fazer:

>>> 'a' in mydict
True
>>> 'c' in mydict
False
RanRag
fonte
hmm ... como eu faria isso? (Desculpe por ser um noob) O aplicativo está hospedado no Google App Engine e não tenho acesso a nenhum arquivo que ele cria.
David Liaw
Eu tenho acesso ao meu código, mas nenhum do código que ele cria ou os usos do motor
David Liaw
Portanto, o código que você postou path = meta_entry['path'].strip('/'),faz parte do seu código ou do mecanismo. Se faz parte do motor, receio que nada possa ser feito.
RanRag
@ Lonehangman: do que apenas fazer print meta_entrye verificar se ele contém pathou não.
RanRag
Eu sou bastante novo em python, você poderia explicar com mais detalhes. Desculpe por ser uma praga
David Liaw
127

Concordo plenamente com os principais comentários de erro. Você também pode usar o método get () do dicionário para evitar as exceções. Isso também pode ser usado para fornecer um caminho padrão, e não Nonecomo mostrado abaixo.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None
Adam Lewis
fonte
9
+1 para comentários .get () muito relevantes. Parece uma boa aplicação do Python EAFP (mais fácil pedir perdão do que permissão) em vez de LBYL (Look Before You Leap), que eu acho menos pitonico.
Niels Bom
32

Para dict, basta usar

if key in dict

e não usar

if key in dict.keys()

Vai levar muito tempo

keywind
fonte
5

Sim, é provavelmente causado por chave não existente.

No meu programa, usei o setdefault para silenciar esse erro, por questões de eficiência. dependendo de quão eficiente é essa linha

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

Eu também sou novo no Python. Na verdade, eu acabei de aprender hoje. Então me perdoe pela ignorância da eficiência.

No Python 3, você também pode usar esta função,

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

Diz-se que nunca irá gerar um erro de chave.

Glenn Yu
fonte
O método get é antigo, acho que até os dict 1.x o possuíam. Mas tenho certeza que 2.7 já o teve.
Jürgen A. Erhard,
3

Isso significa que sua matriz está faltando a chave que você está procurando. Eu trato disso com uma função que retorna o valor, se existir, ou retorna um valor padrão.

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

Resultado:

1
2
#default
Ben Sullins
fonte
7
Argh ... horrível, código não-tônico horrível. Não escreva código PHP em Python: não é uma matriz, é um dicionário (você pode chamá-lo de hash, mas a matriz está correta). E: dicts já têm sua função "keyCheck": em vez de "keyCheck ('key1', myarray, '#default')", você faria "mydict.get ('key1', '#default')"
Jürgen A Erhard
2

Eu recebi esse erro quando estava analisando dictcom aninhado 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])

Traceback:

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

Porque no segundo loop deve ser cats[cat]apenas cat(o que é apenas uma chave)

Assim:

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
pbaranski
fonte
0

Por exemplo, se este é um número:

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

É um trabalho perfeito, mas se você usar, por exemplo:

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

não funciona, porque sua entrada retorna a string '1'. Então você precisa usar int ()

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

Vamos simplificar se você estiver usando o Python 3

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

Se você precisar de mais condição

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

Para o valor da chave dinâmica, você também pode manipular o bloco 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
fonte