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?


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

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

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


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.


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

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

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

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'}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.