Я получаю Key error в python

191

В моей программе Python я получаю эту ошибку:

KeyError: 'variablename'

Из этого кода:

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

Может кто-нибудь объяснить, почему это происходит?

Дэвид Лиу
источник
11
Key errorкак правило, означает, что keyне существует. Итак, вы уверены, что «путь» существует?
RanRag
3
Распечатайте содержимое meta_entryи убедитесь, что ключ, который вы хотите, существует.
Макото

Ответы:

263

KeyErrorОбычно означает , что ключ не существует. Итак, вы уверены, что pathключ существует?

Из официальных документов Python:

исключение KeyError

Возникает, когда ключ набора (словарь) не найден в наборе существующих ключей.

Например:

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

Итак, попробуйте распечатать содержимое meta_entryи проверить, pathсуществует или нет.

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

Или вы можете сделать:

>>> 'a' in mydict
True
>>> 'c' in mydict
False
RanRag
источник
хм ... как бы я это сделал? (Извините за то, что я новичок) Приложение размещено на движке приложений Google, и у меня нет доступа к файлам, которые оно создает.
Дэвид Лиу
У меня есть доступ к моему коду, но ни один из кода, который он создает или использует движок
Дэвид Лиу
Итак, код, который вы разместили, path = meta_entry['path'].strip('/'),является частью вашего кода или движка. Если это часть двигателя, боюсь, ничего не поделаешь.
RanRag
@lonehangman: чем просто сделать print meta_entryи проверить, содержит ли он pathили нет.
RanRag
Я новичок в Python, не могли бы вы объяснить более подробно. Извините за то, что я вредитель
Дэвид Лиу
128

Я полностью согласен с ключевыми ошибками комментариев. Вы также можете использовать метод словаря get (), чтобы избежать исключений. Это также может быть использовано для указания пути по умолчанию, а не Noneкак показано ниже.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None
Адам Льюис
источник
9
+1 за очень актуальный комментарий .get (). Выглядит как хорошее приложение Python EAFP (проще просить прощения, чем разрешения) вместо LBYL (смотри, прежде чем прыгнуть), которое, я думаю, менее питонское.
Нильс Бом
32

Для DICT, просто используйте

if key in dict

и не используйте поиск в списке ключей

if key in dict.keys()

Последнее будет более трудоемким.

keywind
источник
5

Да, это, скорее всего, вызвано несуществующим ключом.

В моей программе я использовал setdefault, чтобы отключить эту ошибку, из соображений эффективности. в зависимости от того, насколько эффективна эта линия

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

Я новичок в Python тоже. На самом деле я только что узнал это сегодня. Так что прости меня за незнание эффективности.

В Python 3 вы также можете использовать эту функцию,

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

Говорят, что это никогда не вызовет ключевой ошибки.

Гленн Ю
источник
Метод get является древним, я думаю, что он был даже в 1.x. Но я уверен, что у 2.7 уже было это.
Юрген А. Эрхард
3

Это означает, что в вашем массиве отсутствует ключ, который вы ищете. Я обрабатываю это с помощью функции, которая либо возвращает значение, если оно существует, либо вместо этого возвращает значение по умолчанию.

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

Вывод:

1
2
#default
Бен Саллинс
источник
7
Аааа ... ужасный, ужасный непифонический код. Не пишите PHP-код на Python: это не массив, это словарь (вы можете назвать это хешем, но массив прямо). И: у dicts уже есть ваша функция «keyCheck»: вместо «keyCheck ('key1', myarray, '#default')" вы должны выполнить "mydict.get ('key1', '#default')"
Юрген А Эрхард
2

Я получил эту ошибку, когда я анализировал dictс вложенным 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 (most recent call last):
      File "<input>", line 3, in <module>
    KeyError: 'K'

Потому что во втором цикле должно быть cats[cat]вместо всего лишь cat(что является просто ключом)

Так:

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
источник
0

Например, если это число:

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

Это отлично работает, но если вы используете, например:

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

это не работает, потому что ваш ввод возвращает строку '1'. Так что вам нужно использовать int ()

ouloulou[int(input("select 1 2 or 3"))]()
lemoinemeddy
источник
0

Давайте сделаем это проще, если вы используете Python 3

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

Если вам нужно еще условие

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

Для значения динамического ключа вы также можете обработать блок 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'}
Мутху Кумар
источник