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.