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.