Python KeyError-Ausnahmen und deren Handhabung
DieKeyError
-Ausnahme von Python ist eine häufige Ausnahme für Anfänger. Zu wissen, warum einKeyError
erhöht werden kann, und einige Lösungen, die verhindern, dass Ihr Programm gestoppt wird, sind wesentliche Schritte zur Verbesserung als Python-Programmierer.
Am Ende dieses Tutorials werden Sie wissen:
-
Was ein Python
KeyError
normalerweise bedeutet -
Wo sonst könnten Sie ein
KeyError
in der Standardbibliothek sehen -
Wie man mit einem
KeyError
umgeht, wenn man es sieht
Free Bonus:Click here to get our free Python Cheat Sheet zeigt Ihnen die Grundlagen von Python 3, z. B. das Arbeiten mit Datentypen, Wörterbüchern, Listen und Python-Funktionen.
Was ein PythonKeyError
normalerweise bedeutet
Ein PythonKeyError
exception wird ausgelöst, wenn Sie versuchen, auf einen Schlüssel zuzugreifen, der nicht indictionary (dict
) enthalten ist.
Pythonsofficial documentation besagt, dassKeyError
ausgelöst wird, wenn auf einen Zuordnungsschlüssel zugegriffen wird und nicht in der Zuordnung gefunden wird. Eine Zuordnung ist eine Datenstruktur, die einen Wertesatz einem anderen zuordnet. Die häufigste Zuordnung in Python ist das Wörterbuch.
PythonKeyError
ist eine ArtLookupError
-Ausnahme und zeigt an, dass beim Abrufen des gesuchten Schlüssels ein Problem aufgetreten ist. Wenn Sie einKeyError
sehen, bedeutet die semantische Bedeutung, dass der gesuchte Schlüssel nicht gefunden werden konnte.
Im folgenden Beispiel sehen Sie ein Wörterbuch (ages
), das für das Alter von drei Personen definiert ist. Wenn Sie versuchen, auf einen Schlüssel zuzugreifen, der nicht im Wörterbuch enthalten ist, wird einKeyError
ausgelöst:
>>>
>>> ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
>>> ages['Michael']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'Michael'
Wenn Sie hier versuchen, auf den Schlüssel'Michael'
images
-Wörterbuch zuzugreifen, wird einKeyError
ausgelöst. Am Ende des Tracebacks erhalten Sie die relevanten Informationen:
-
Die Tatsache, dass a
KeyError
erhöht wurde -
Der Schlüssel, der nicht gefunden werden konnte, war
'Michael'
Die vorletzte Zeile gibt an, in welcher Zeile die Ausnahme ausgelöst wurde. Diese Informationen sind hilfreicher, wenn Sie Python-Code aus einer Datei ausführen.
Note: Wenn in Python eine Ausnahme ausgelöst wird, erfolgt dies mittraceback. Der Traceback bietet Ihnen alle relevanten Informationen, um festzustellen, warum die Ausnahme ausgelöst wurde und was sie verursacht hat.
Das Erlernen des Lesens eines Python-Tracebacks und das Verstehen dessen, was es Ihnen sagt, sind entscheidend, um sich als Python-Programmierer zu verbessern.
Im folgenden Programm sehen Sie das Wörterbuch vonages
erneut definiert. Dieses Mal werden Sie aufgefordert, den Namen der Person anzugeben, für die das Alter abgerufen werden soll:
1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5 print(f'{person} is {ages[person]} years old.')
Dieser Code nimmt den Namen an, den Sie an der Eingabeaufforderung angegeben haben, und versucht, das Alter für diese Person abzurufen. Was auch immer Sie an der Eingabeaufforderung eingeben, wird in Zeile 4 als Schlüssel für dasages
-Wörterbuch verwendet.
Wenn wir das fehlgeschlagene Beispiel von oben wiederholen, erhalten wir einen weiteren Traceback, diesmal mit Informationen zu der Zeile in der Datei, aus derKeyError
ausgelöst wird:
$ python ages.py
Get age for: Michael
Traceback (most recent call last):
File "ages.py", line 4, in
print(f'{person} is {ages[person]} years old.')
KeyError: 'Michael'
Das Programm schlägt fehl, wenn Sie einen Schlüssel angeben, der nicht im Wörterbuch enthalten ist. Hier weisen die letzten Zeilen des Tracebacks auf das Problem hin. File "ages.py", line 4, in <module>
gibt an, in welcher Zeile welcher Datei die resultierendeKeyError
-Ausnahme ausgelöst wurde. Dann wird Ihnen diese Zeile angezeigt. Schließlich liefert die Ausnahme vonKeyError
den fehlenden Schlüssel.
Sie können also sehen, dass die letzte Zeile des Tracebacks vonKeyError
nicht genügend Informationen enthält, aber die Zeilen davor können Sie dem Verständnis, was schief gelaufen ist, viel näher bringen.
Note: Wie im obigen Beispiel verwenden die meisten anderen Beispiele in diesem Lernprogrammf-strings, die in Python 3.6 eingeführt wurden.
Wo sonst könnten Sie PythonKeyError
in der Standardbibliothek sehen
In den meisten Fällen wird ein PythonKeyError
ausgelöst, weil ein Schlüssel in einem Wörterbuch oder einer Wörterbuchunterklasse (z. B.os.environ
) nicht gefunden wird.
In seltenen Fällen wird es möglicherweise auch an anderen Stellen in der Python-Standardbibliothek angezeigt, z. B. im Modulzipfile
, wenn ein Element nicht in einem ZIP-Archiv gefunden wird. Diese Stellen behalten jedoch die gleiche semantische Bedeutung wie PythonKeyError
bei, bei dem der angeforderte Schlüssel nicht gefunden wird.
Im folgenden Beispiel sehen Sie, wie Sie mit der Klassezipfile.ZipFile
Informationen zu einem ZIP-Archiv mit.getinfo()
extrahieren:
>>>
>>> from zipfile import ZipFile
>>> zip_file = ZipFile('the_zip_file.zip')
>>> zip_file.getinfo('something')
Traceback (most recent call last):
File "", line 1, in
File "/path/to/python/installation/zipfile.py", line 1304, in getinfo
'There is no item named %r in the archive' % name)
KeyError: "There is no item named 'something' in the archive"
Dies sieht nicht wirklich wie eine Suche nach Wörterbuchschlüsseln aus. Stattdessen ist es ein Aufruf vonzipfile.ZipFile.getinfo()
, der die Ausnahme auslöst.
Der Traceback sieht auch etwas anders aus, da ein wenig mehr Informationen angegeben werden als nur der fehlende Schlüssel:KeyError: "There is no item named 'something' in the archive"
.
Als letztes ist hier zu beachten, dass die Zeile, in derKeyError
ausgelöst wurden, nicht in Ihrem Code enthalten ist. Es befindet sich im Code vonzipfile
, aber die vorherigen Zeilen des Tracebacks geben an, welche Zeilen in Ihrem Code das Problem verursacht haben.
Wenn Sie PythonKeyError
in Ihrem eigenen Code erhöhen müssen
Es kann vorkommen, dass es füryou to raiseeine PythonKeyError
-Ausnahme in Ihrem eigenen Code sinnvoll ist. Dies kann durch Verwenden des Schlüsselwortsraise
und Aufrufen der AusnahmeKeyError
erfolgen:
raise KeyError(message)
Normalerweise wäremessage
der fehlende Schlüssel. Wie im Fall des Paketszipfile
können Sie sich jedoch dafür entscheiden, ein bisschen mehr Informationen anzugeben, damit der nächste Entwickler besser versteht, was schief gelaufen ist.
Wenn Sie PythonKeyError
in Ihrem eigenen Code auslösen möchten, stellen Sie einfach sicher, dass Ihr Anwendungsfall mit der semantischen Bedeutung der Ausnahme übereinstimmt. Es sollte bedeuten, dass der gesuchte Schlüssel nicht gefunden werden konnte.
Wie man mit PythonKeyError
umgeht, wenn man es sieht
Wenn Sie aufKeyError
stoßen, gibt es einige Standardmethoden, um damit umzugehen. Abhängig von Ihrem Anwendungsfall sind einige dieser Lösungen möglicherweise besser als andere. Das ultimative Ziel ist es, zu verhindern, dass unerwarteteKeyError
-Ausnahmen ausgelöst werden.
Die übliche Lösung:.get()
WennKeyError
aus einer fehlgeschlagenen Suche nach Wörterbuchschlüsseln in Ihrem eigenen Code ausgelöst wird, können Sie.get()
verwenden, um entweder den am angegebenen Schlüssel gefundenen Wert oder einen Standardwert zurückzugeben.
Ähnlich wie im vorherigen Beispiel zum Abrufen des Alters zeigt das folgende Beispiel eine bessere Möglichkeit, das Alter mithilfe des an der Eingabeaufforderung angegebenen Schlüssels aus dem Wörterbuch abzurufen:
1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5 age = ages.get(person)
6
7 if age:
8 print(f'{person} is {age} years old.')
9 else:
10 print(f"{person}'s age is unknown.")
Hier zeigt Zeile 5, wie Sie den Alterswert ausages
mit.get()
ermitteln können. Dies führt dazu, dass die Variableage
den im Wörterbuch für den angegebenen Schlüssel gefundenen Alterswert oder in diesem Fall den StandardwertNone
aufweist.
Dieses Mal wird keineKeyError
-Ausnahme ausgelöst, da die sicherere.get()
-Methode verwendet wird, um das Alter zu ermitteln, anstatt direkt auf den Schlüssel zuzugreifen:
$ python ages.py
Get age for: Michael
Michael's age is unknown.
In der obigen Beispielausführung wirdKeyError
nicht mehr ausgelöst, wenn ein fehlerhafter Schlüssel bereitgestellt wird. Der Schlüssel'Michael'
wird nicht im Wörterbuch gefunden, aber durch Verwendung von.get()
erhalten wir einNone
zurück, anstatt ein erhöhtesKeyError
.
Die Variableage
hat entweder das Alter der Person im Wörterbuch oder den Standardwert (standardmäßigNone
). Sie können auch einen anderen Standardwert im Aufruf von.get()
angeben, indem Sie ein zweites Argument übergeben.
Dies ist Zeile 5 aus dem obigen Beispiel mit einem anderen Standardalter, das mit.get()
angegeben wurde:
age = ages.get(person, 0)
Hier würde anstelle von'Michael'
None
0
zurückgeben, da der Schlüssel nicht gefunden wird und der Standardwert für die Rückgabe jetzt0
ist.
Die seltene Lösung: Nach Schlüsseln suchen
Es gibt Zeiten, in denen Sie die Existenz eines Schlüssels in einem Wörterbuch feststellen müssen. In diesen Fällen liefert die Verwendung von.get()
möglicherweise nicht die richtigen Informationen. Wenn einNone
von einem Aufruf an.get()
zurückgegeben wird, kann dies bedeuten, dass der Schlüssel nicht gefunden wurde oder dass der am Schlüssel im Wörterbuch gefundene Wert tatsächlichNone
ist.
Mit einem Wörterbuch oder einem wörterbuchähnlichen Objekt können Sie mit dem Operatorin
bestimmen, ob sich ein Schlüssel in der Zuordnung befindet. Dieser Operator gibt einen booleschen Wert (True
oderFalse
) zurück, der angibt, ob der Schlüssel im Wörterbuch gefunden wurde.
In diesem Beispiel erhalten Sie einresponse
-Wörterbuch, wenn Sie eine API aufrufen. Für diese Antwort ist möglicherweise ein Schlüsselwert vonerror
in der Antwort definiert, was darauf hinweist, dass sich die Antwort in einem Fehlerzustand befindet:
1 # parse_api_response.py
2 ...
3 # Assuming you got a `response` from calling an API that might
4 # have an error key in the `response` if something went wrong
5
6 if 'error' in response:
7 ... # Parse the error state
8 else:
9 ... # Parse the success state
Hier besteht ein Unterschied darin, zu überprüfen, ob der Schlüsselerror
inresponse
vorhanden ist, und einen Standardwert vom Schlüssel zu erhalten. Dies ist ein seltener Fall, in dem Sie tatsächlich suchen, wenn sich der Schlüssel im Wörterbuch befindet und nicht der Wert dieses Schlüssels.
Die allgemeine Lösung:try
except
Wie bei jeder Ausnahme können Sie immer den Blocktry
except
verwenden, um den potenziellen Code für das Auslösen von Ausnahmen zu isolieren und eine Sicherungslösung bereitzustellen.
Sie können den Blocktry
except
in einem ähnlichen Beispiel wie zuvor verwenden, diesmal jedoch mit einer Standardnachricht, die gedruckt werden soll, falls im Normalfall einKeyError
ausgelöst wird:
1 # ages.py
2
3 ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
4 person = input('Get age for: ')
5
6 try:
7 print(f'{person} is {ages[person]} years old.')
8 except KeyError:
9 print(f"{person}'s age is unknown.")
Hier sehen Sie den Normalfall im Blocktry
, in dem der Name und das Alter der Person gedruckt werden. Der Sicherungsfall befindet sich im Blockexcept
. Wenn im Normalfall einKeyError
ausgelöst wird, muss der Sicherungsfall eine andere Nachricht drucken.
Die Blocklösungtry
except
ist auch eine großartige Lösung für andere Orte, die.get()
oder den Operatorin
möglicherweise nicht unterstützen. Dies ist auch die beste Lösung, wennKeyError
aus dem Code einer anderen Person ausgelöst wird.
Hier ist ein Beispiel, in dem das Paketzipfile
erneut verwendet wird. Dieses Mal gibt uns der Blocktry
except
eine Möglichkeit, die Ausnahme vonKeyError
vom Stoppen des Programms zu stoppen:
>>>
>>> from zipfile import ZipFile
>>> zip = ZipFile('the_zip_file.zip')
>>> try:
... zip.getinfo('something')
... except KeyError:
... print('Can not find "something"')
...
Can not find "something"
Da die KlasseZipFile
nicht wie das Wörterbuch.get()
bereitstellt, müssen Sie die Lösungtry
except
verwenden. In diesem Beispiel müssen Sie nicht im Voraus wissen, welche Werte gültig sind, um an.getinfo()
übergeben zu werden.
Fazit
Sie kennen jetzt einige häufige Stellen, an denen die AusnahmeKeyError
von Python ausgelöst werden könnte, und einige großartige Lösungen, mit denen Sie verhindern können, dass sie Ihr Programm stoppen.
Wenn Sie das nächste Mal einKeyError
sehen, werden Sie wissen, dass es sich wahrscheinlich nur um eine schlechte Suche nach Wörterbuchschlüsseln handelt. Sie können auch alle Informationen finden, die Sie benötigen, um festzustellen, woher der Fehler kommt, indem Sie sich die letzten Zeilen des Tracebacks ansehen.
Wenn das Problem eine Suche nach Wörterbuchschlüsseln in Ihrem eigenen Code ist, können Sie vom direkten Zugriff auf den Schlüssel im Wörterbuch zur Verwendung der sichereren.get()
-Methode mit einem Standardrückgabewert wechseln. Wenn das Problem nicht von Ihrem eigenen Code herrührt, ist die Verwendung des Blockstry
except
am besten geeignet, um den Codefluss zu steuern.
Ausnahmen müssen nicht beängstigend sein. Sobald Sie wissen, wie Sie die Informationen verstehen, die Ihnen in ihren Rückverfolgungen und der Grundursache der Ausnahme zur Verfügung gestellt werden, können Sie diese Lösungen verwenden, um den Ablauf Ihrer Programme vorhersehbarer zu gestalten.