Python'da Anahtar hatası alıyorum


191

Python programımda bu hatayı alıyorum:

KeyError: 'variablename'

Bu koddan:

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

Herkes bunun neden olduğunu açıklayabilir mi?


11
Key errorgenellikle keyvar olmadığı anlamına gelir . Peki, 'yol'un var olduğundan emin misin?
— RanRag

3
İçeriğini yazdırın ve meta_entryistediğiniz anahtarın var olduğundan emin olun.
— Makoto

Yanıtlar:


262

A KeyErrorgenellikle anahtarın mevcut olmadığı anlamına gelir. Peki, pathanahtarın var olduğundan emin misiniz ?

Resmi python belgelerinden:

istisna KeyError

Mevcut anahtarlar kümesinde bir eşleme (sözlük) anahtarı bulunmadığında yükseltilir.

Örneğin:

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

Bu nedenle, içeriğini yazdırmaya çalışın meta_entryve pathvar olup olmadığını kontrol edin .

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

Veya şunları yapabilirsiniz:

>>> 'a' in mydict
True
>>> 'c' in mydict
False

hmm ... bunu nasıl yaparım? (Noob olduğu için özür dilerim) Uygulama google uygulama motorunda barındırılıyor ve oluşturduğu dosyalara erişimim yok.
— David Liaw

Koduma erişimim var ancak oluşturduğu veya motorun kullandığı kodların hiçbiri yok
— David Liaw

Bu nedenle, gönderdiğiniz path = meta_entry['path'].strip('/'),kod, kodunuzun veya motorunuzun bir parçasıdır. Motorun bir parçasıysa korkarım hiçbir şey yapılamaz.
— RanRag

@lonehangman: sadece yapmak print meta_entryve içerip içermediğini kontrol etmek path.
— RanRag

Python için oldukça yeniyim, lütfen daha ayrıntılı olarak açıklayabilir misiniz? Zararlı
— olduğum

128

Anahtar hata yorumlarına tamamen katılıyorum. Ayrıca kullanabilirsiniz Sözlüğün olsun () durumları önlemek için de bir yöntem. Bu, Noneaşağıda gösterildiği gibi değil, varsayılan bir yol vermek için de kullanılabilir .

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

9
Çok alakalı .get () yorumu için +1. Daha az Pythonic olduğunu düşündüğüm LBYL (Sıçrama Öncesi Bak) yerine Python EAFP'nin (İzin Vermek İçin Affetmek Daha Kolay) iyi bir uygulaması gibi görünüyor.
— Niels Bom

32

Dikte etmek için,

if key in dict

ve anahtar listesinde aramayı kullanma

if key in dict.keys()

İkincisi daha fazla zaman alıcı olacaktır.


5

Evet, büyük olasılıkla mevcut olmayan anahtardan kaynaklanır.

Programımda, verimlilik kaygısı için bu hatayı susturmak için setdefault kullandım. bu hattın ne kadar verimli olduğuna bağlı olarak

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

Ben de Python'da yeniyim. Aslında bugün öğrendim. Verimliliğin bilgisizliğinden beni affedin.

Python 3'te bu işlevi de kullanabilirsiniz,

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

Asla önemli bir hata yaratmayacağı söyleniyor.


Get yöntemi eski, bence 1.x dicts bile vardı. Ama eminim 2.7 zaten vardı.
— Jürgen A. Erhard

3

Bu, dizinizde aradığınız anahtarı eksik olduğu anlamına gelir. Bu, varsa değeri döndüren veya bunun yerine varsayılan bir değer döndüren bir işlevle işlemek.

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

Çıktı:

1
2
#default

7
Ahh ... korkunç, korkunç ses kodları. Python'da PHP kodu yazmayın: bu bir dizi değil, bir sözlüktür (buna karma diyebilirsiniz, ancak dizi dışarıdadır). Ve: Zaten "keyCheck" fonksiyonunuz var: "keyCheck ('key1', myarray, '#default')" yerine "mydict.get ('key1', '#default')"
— Jürgen A Erhard

2

Ben dictiç içe ile ayrıştırırken bu hatayı aldım 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])

Geri iz:

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

Çünkü ikinci döngüde cats[cat]sadece olmalı cat(sadece bir anahtar nedir)

Yani:

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

verir

black
10
white
8

0

Örneğin, bu bir sayı ise:

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

Mükemmel çalışıyor, ancak örneğin:

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

işe yaramaz, çünkü giriş dönüş dizeniz '1'. Yani int ()

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

0

Python 3 kullanıyorsanız bunu basitleştirelim

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

Başka bir şarta ihtiyacınız varsa

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

Dinamik anahtar değeri için try-exception bloğunu da kullanabilirsiniz

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'}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.