Saya mendapatkan kesalahan kunci dengan python

191

Dalam program python saya, saya mendapatkan kesalahan ini:

KeyError: 'variablename'

Dari kode ini:

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

Adakah yang bisa menjelaskan mengapa ini terjadi?

David Liaw
sumber
11
Key errorumumnya berarti keytidak ada. Jadi, apakah Anda yakin 'jalan' ada.?
RanRag
3
Cetak konten meta_entrydan pastikan kunci yang Anda inginkan ada.
Makoto

Jawaban:

263

SEBUAH KeyError umumnya berarti kuncinya tidak ada. Jadi, apakah Anda yakin pathkuncinya ada?

Dari dokumen python resmi:

pengecualian KeyError

Dibesarkan ketika kunci pemetaan (kamus) tidak ditemukan di set kunci yang ada.

Sebagai contoh:

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

Jadi, cobalah untuk mencetak konten meta_entrydan periksa apakah pathada atau tidak.

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

Atau, Anda dapat melakukan:

>>> 'a' in mydict
True
>>> 'c' in mydict
False
RanRag
sumber
hmm ... bagaimana saya melakukannya? (Maaf karena menjadi noob) Aplikasi di-host di mesin aplikasi google dan saya tidak memiliki akses ke file apa pun yang dibuatnya.
David Liaw
Saya memiliki akses ke kode saya tetapi tidak ada kode yang dibuat atau menggunakan mesin
David Liaw
Jadi, kode yang Anda poskan path = meta_entry['path'].strip('/'),itu bagian dari kode Anda atau mesin. Jika itu bagian dari mesin, saya khawatir tidak ada yang bisa dilakukan.
RanRag
@ lonehangman: daripada hanya lakukan print meta_entrydan periksa apakah mengandung pathatau tidak.
RanRag
Saya cukup baru untuk python, bisa tolong jelaskan dengan lebih detail. Maaf karena menjadi hama
David Liaw
128

Saya sepenuhnya setuju dengan komentar kunci kesalahan. Anda juga bisa menggunakan metode get () kamus untuk menghindari pengecualian. Ini juga dapat digunakan untuk memberikan jalur default daripada Noneseperti yang ditunjukkan di bawah ini.

>>> d = {"a":1, "b":2}
>>> x = d.get("A",None)
>>> print x
None
Adam Lewis
sumber
9
+1 untuk komentar .get () yang sangat relevan. Sepertinya aplikasi yang baik dari Python EAFP (Lebih Mudah Meminta Pengampunan daripada Izin) daripada LBYL (Look Before You Leap) yang saya pikir kurang Pythonic.
Niels Bom
32

Untuk dict, cukup gunakan

if key in dict

dan jangan gunakan pencarian di daftar kunci

if key in dict.keys()

Yang terakhir akan lebih memakan waktu.

gantungan kunci
sumber
5

Ya, kemungkinan besar disebabkan oleh kunci yang tidak ada.

Dalam program saya, saya menggunakan setdefault untuk membisukan kesalahan ini, untuk masalah efisiensi. tergantung pada seberapa efisien garis ini

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

Saya juga baru di Python. Sebenarnya saya baru mempelajarinya hari ini. Jadi maafkan saya atas ketidaktahuan efisiensi.

Di Python 3, Anda juga dapat menggunakan fungsi ini,

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

Dikatakan bahwa itu tidak akan pernah meningkatkan kesalahan kunci.

Glenn Yu
sumber
Metode get kuno, saya pikir bahkan 1,x dicts memilikinya. Tapi saya yakin 2,7 sudah memilikinya.
Jürgen A. Erhard
3

Ini berarti array Anda tidak memiliki kunci yang Anda cari. Saya menangani ini dengan fungsi yang mengembalikan nilai jika ada atau mengembalikan nilai default sebagai gantinya.

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

Keluaran:

1
2
#default
Ben Sullins
sumber
7
Argh ... kode unpythonic mengerikan, mengerikan. Jangan menulis kode PHP dengan Python: ini bukan array, ini adalah kamus (Anda bisa menyebutnya hash, tetapi array langsung keluar). Dan: dicts sudah memiliki fungsi "keyCheck" Anda: alih-alih "keyCheck ('key1', myarray, '#default')" Anda akan melakukan "mydict.get ('key1', '#default')"
Jürgen A Erhard
2

Saya menerima kesalahan ini ketika saya menguraikan dictdengan bersarang 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])

Melacak kembali:

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

Karena di loop kedua seharusnya cats[cat]malah adil cat(apa itu hanya kunci)

Begitu:

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

Memberi

black
10
white
8
pbaranski
sumber
0

Misalnya, jika ini adalah angka:

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

Ini berfungsi dengan baik, tetapi jika Anda menggunakan misalnya:

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

tidak berfungsi, karena input Anda mengembalikan string '1'. Jadi, Anda perlu menggunakan int ()

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

Biarkan kami membuatnya sederhana jika Anda menggunakan Python 3

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

Jika Anda membutuhkan kondisi lain

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

Untuk nilai kunci dinamis, Anda juga dapat menangani melalui blok coba-pengecualian

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
sumber