Я отримую ключову помилку в python


191

У своїй програмі python я отримую цю помилку:

KeyError: 'variablename'

З цього коду:

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

Хто-небудь може пояснити, чому це відбувається?


11
Key errorяк правило, означає, що keyне існує. Отже, ви впевнені, що "шлях" існує?
RanRag

3
Роздрукуйте вміст meta_entryта переконайтеся, що потрібний ключ.
Макото

Відповіді:


261

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

хм ... як би я це зробив? (Вибачте за те, що ноуб) Додаток розміщено в двигуні додатка google, і я не маю доступу до файлів, які він створює.
Девід Ляв

У мене є доступ до мого коду, але жоден код, який він створює та не використовує двигун
Девід Ляв,

Отже, опублікований вами код path = meta_entry['path'].strip('/'),- це частина вашого коду чи двигуна. Якщо це частина двигуна, я боюся, що нічого не можна зробити.
RanRag

@lonehangman: ніж просто робити print meta_entryі перевірити, чи містить він pathчи ні.
RanRag

Я зовсім новачок у python, чи можете ви поясніть, будь ласка, більш докладно. Вибачте за те, що шкідник
Девід Ляв

127

Я повністю згоден з ключовими коментарями про помилки. Ви також можете використовувати метод get () словника, щоб уникнути винятків. Це також може бути використане для надання шляху за замовчуванням, а не Noneяк показано нижче.

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

9
+1 за дуже релевантний коментар .get (). Виглядає як хороший додаток Python EAFP (простіше просити прощення, ніж дозвіл) замість LBYL (Подивися, перш ніж стрибнути), який, на мою думку, є менш пітонічним.
Niels Bom

32

Для диктування просто використовуйте

if key in dict

і не використовуйте пошук у списку ключів

if key in dict.keys()

Останнє буде більш трудомістким.


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: це не масив, це словник (ви можете назвати його хеш, але масив прямо не виходить). І: у диктів вже є ваша функція "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

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

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

Для значення динамічного ключа ви також можете управляти через блок виключення спробу

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'}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.