Python KeyError-Ausnahmen und deren Handhabung

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 PythonKeyErrornormalerweise bedeutet

  • Wo sonst könnten Sie einKeyError in der Standardbibliothek sehen

  • Wie man mit einemKeyError 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 PythonKeyErrornormalerweise bedeutet

Ein PythonKeyErrorexception 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 aKeyError 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 vonageserneut 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 vonKeyErrorden fehlenden Schlüssel.

Sie können also sehen, dass die letzte Zeile des Tracebacks vonKeyErrornicht 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 PythonKeyErrorin 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 AusnahmeKeyErrorerfolgen:

raise KeyError(message)

Normalerweise wäremessage der fehlende Schlüssel. Wie im Fall des Paketszipfilekö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 PythonKeyErrorumgeht, 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'None0 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 Operatorinbestimmen, 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 vonerrorin 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üsselerrorinresponse 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:tryexcept

Wie bei jeder Ausnahme können Sie immer den Blocktryexcept verwenden, um den potenziellen Code für das Auslösen von Ausnahmen zu isolieren und eine Sicherungslösung bereitzustellen.

Sie können den Blocktryexcept 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ösungtryexcept 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 Paketzipfileerneut verwendet wird. Dieses Mal gibt uns der Blocktryexcept eine Möglichkeit, die Ausnahme vonKeyErrorvom 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ösungtryexcept 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 AusnahmeKeyErrorvon 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 Blockstryexceptam 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.