Otrzymuję błąd klucza w pythonie


191

W moim programie python pojawia się ten błąd:

KeyError: 'variablename'

Z tego kodu:

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

Czy ktoś może wyjaśnić, dlaczego tak się dzieje?


11
Key errorogólnie oznacza, że keynie istnieje. Czy na pewno istnieje „ścieżka”?
RanRag

3
Wydrukuj zawartość meta_entryi upewnij się, że klucz istnieje.
Makoto,

Odpowiedzi:


261

KeyErrorOznacza zazwyczaj klucz nie istnieje. Jesteś pewien, że pathklucz istnieje?

Z oficjalnych dokumentów Pythona:

wyjątek KeyError

Wywoływany, gdy nie znaleziono klucza mapowania (słownika) w zestawie istniejących kluczy.

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

Spróbuj wydrukować zawartość meta_entryi sprawdź, czy pathistnieje.

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

Lub możesz zrobić:

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

hmm ... jak miałbym to zrobić? (Przepraszamy za bycie noobem) Aplikacja jest hostowana w wyszukiwarce Google i nie mam dostępu do tworzonych przez nią plików.
David Liaw,

Mam dostęp do mojego kodu, ale żaden z kodów, które tworzy, ani z których korzysta silnik
David Liaw,

Więc opublikowany kod path = meta_entry['path'].strip('/'),jest częścią kodu lub silnika. Jeśli jest częścią silnika, obawiam się, że nic nie da się zrobić.
RanRag

@lonehangman: niż po prostu zrób print meta_entryi sprawdź, czy zawiera path.
RanRag

Jestem całkiem nowy w Pythonie, czy mógłbyś wyjaśnić bardziej szczegółowo. Przepraszamy za bycie szkodnikiem
David Liaw,

127

W pełni zgadzam się z komentarzami dotyczącymi błędu klucza. Możesz także użyć metody get () w słowniku, aby uniknąć wyjątków. Można to również wykorzystać do podania domyślnej ścieżki, a nie Nonejak pokazano poniżej.

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

9
+1 za bardzo odpowiedni komentarz .get (). Wygląda na dobrą aplikację Python EAFP (łatwiej prosić o przebaczenie niż pozwolenie) zamiast LBYL (Look Before You Leap), która moim zdaniem jest mniej Pythonic.
Niels Bom

32

Do dykta wystarczy użyć

if key in dict

i nie używaj wyszukiwania na liście kluczy

if key in dict.keys()

Ten ostatni będzie bardziej czasochłonny.


5

Tak, najprawdopodobniej jest to spowodowane nieistniejącym kluczem.

W moim programie użyłem setdefault, aby wyciszyć ten błąd ze względu na wydajność. w zależności od wydajności tej linii

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

Też jestem nowy w Pythonie. Właściwie właśnie się tego nauczyłem dzisiaj. Więc wybacz mi ignorancję skuteczności.

W Pythonie 3 możesz także użyć tej funkcji,

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

Mówi się, że nigdy nie spowoduje to błędu kluczowego.


Metoda get jest starożytna, myślę, że miała ją nawet wersja 1.x. Ale jestem pewien, że 2.7 już to miał.
Jürgen A. Erhard

3

Oznacza to, że w tablicy brakuje szukanego klucza. Obsługuję to funkcją, 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')

Wynik:

1
2
#default

7
Argh ... okropny, okropny, niepythonic code. Nie pisz kodu PHP w Pythonie: to nie jest tablica, to słownik (możesz nazwać to hash, ale tablica jest od razu). I: dykty mają już funkcję „keyCheck”: zamiast „keyCheck ('key1', myarray, '#default')„ zrobiłbyś ”mydict.get ('key1', '#default')”
Jürgen A , Erhard

2

Ten błąd wystąpił podczas analizowania dictz zagnieżdżeniem 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 powinno być cats[cat]zamiast tego po prostucat (co jest tylko kluczem)

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

0

Na przykład, jeśli jest to liczba:

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

Działa idealnie, ale jeśli używasz na przykład:

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

to nie działa, ponieważ wprowadzony ciąg znaków „1”. Musisz więc użyć int ()

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

0

Uprośćmy to, jeśli używasz języka Python 3

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

Jeśli potrzebujesz innego warunku

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

W przypadku wartości klucza dynamicznego można również obsługiwać za pomocą bloku try-wyjątku

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'}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.