2012-04-12 14 views
95

W moim programie Pythona ja dostaję ten błąd:Dostaję Key błąd w Pythonie

KeyError: 'variablename' 

Od tego kodu:

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

Może ktoś proszę wyjaśnić, dlaczego tak się dzieje?

+5

'Key error' oznacza generalnie' key' nie istnieje. Czy na pewno istnieje "ścieżka"? – RanRag

+2

Wydrukuj zawartość 'meta_entry' i upewnij się, że klucz istnieje. – Makoto

Odpowiedz

139

A KeyError ogólnie oznacza, że ​​klucz nie istnieje. Czy na pewno istnieje klucz path?

z oficjalnej docs Pythona:

wyjątek KeyError

Raised when a mapping (dictionary) key is not found in the set of existing keys.

Na przykład:

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

Tak, spróbuj wydrukować zawartość meta_entry i sprawdzić czy path istnieje lub nie.

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

Albo można zrobić:

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

hmm ... jak bym to zrobił? (Przepraszam za bycie noobem) Aplikacja jest hostowana na silniku aplikacji Google i nie mam dostępu do żadnych plików, które ona tworzy. – bidluo

+0

Więc nie masz dostępu do kodu Pythona, z którego korzysta aplikacja.? – RanRag

+0

Mam dostęp do mojego kodu, ale żaden z kodu, który on tworzy lub silnik nie używa – bidluo

79

pełni zgadzam się z kluczowymi uwag o błędach. Można również użyć metody dictionary's get(), aby uniknąć wyjątków. Można to również wykorzystać do podania domyślnej ścieżki zamiast None, jak pokazano poniżej.

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

+1 za bardzo trafny komentarz .get(). Wygląda to na dobre zastosowanie Pythona EAFP (łatwiejsze pytanie o przebaczenie niż pozwolenie) zamiast LBYL (Look Before You Leap), który moim zdaniem jest mniej Pythoniczny. –

2

Tak, najprawdopodobniej jest to spowodowane nieistniejącym kluczem.

W moim programie użyłem setdefault do wyciszenia tego błędu, w celu zwiększenia efektywności. zależności od tego, jak skuteczny jest ten wiersz

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

Jestem nowy w Pythonie zbyt. W rzeczywistości właśnie tego nauczyłem się dzisiaj. Więc wybacz mi ignorancję skuteczności.

W Pythonie 3, można również korzystać z tej funkcji,

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

Mówi się, że nigdy nie podniesie kluczowy błąd.

+0

Metoda get jest starożytna, myślę, że nawet 1.x dyktownicy ją posiadali. Ale jestem pewien, że 2.7 już to miało. –

1

Oznacza to, że w tablicy brakuje poszukiwanego klucza. Obsługuję to za pomocą funkcji, która albo zwraca wartość, jeśli istnieje, albo zwraca wartość domyślną.

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

wyjściowa:

1 
2 
#default 
+0

Tak, już to wymyśliłem jakiś czas temu, ale dzięki. – bidluo

+4

Argh ... okropny, okropny, niepytonowy kod. Nie pisz kodu PHP w Pythonie: to nie jest tablica, to słownik (możesz go nazwać hash, ale tablica jest już na miejscu). I: dyktuje już twoją funkcję "keyCheck": zamiast "keyCheck (" key1 ', myarray, "#default") "zrobiłbyś" mydict.get (' key1 ',' #default ') " –

14

Dla dict, wystarczy użyć

if key in dict

i nie używać

if key in dict.keys()

To będzie czasochłonne

0

Dostałem ten błąd, kiedy parsowania dict z zagnieżdżonego 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:

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

Ponieważ w drugiej pętli powinna być cats[cat] zamiast tylko cat (co jest tylko kluczem)

A więc:

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

Daje

black 
10 
white 
8 
Powiązane problemy