Course
Excepciones KeyError en Python y cómo solucionarlas
Incluso los programadores más experimentados cometen errores de programación. Para los programadores de Python, estos errores entran en una de estas dos categorías: errores o excepciones.
Los errores están relacionados principalmente con la sintaxis. Deben fijarse para que el programa funcione. Una excepción, en cambio, ocurre cuando el código es sintácticamente correcto, pero algo interrumpe el programa cuando se está ejecutando.
En este tutorial, examinaremos una de las excepciones más comunes con las que se encuentran tanto los programadores noveles como los experimentados: la excepción KeyError
. Cubriremos los detalles de KeyError
de Python , proporcionando ejemplos y diferentes técnicas para manejar este tipo de excepción. Si quieres aprender a identificar y corregir errores en Python, consulta también nuestro tutorial Tratamiento de errores y excepciones en Python.
¿Qué es una excepción KeyError?
En Python, una excepción KeyError
es una de las excepciones incorporadas que está diseñada para manejar una amplia gama de condiciones de error comunes. Una excepción KeyError
puede entenderse como una subclase, junto con IndexError
, de la excepción más general LookupError
, todas las cuales son objetos de la clase Exception
.
Concretamente, una excepción KeyError
se produce cuando un programador intenta acceder a una clave que no existe en un diccionario. Un diccionario, como referencia, es una estructura de datos que almacena datos en pares clave-valor, y se accede al valor de un diccionario a través de su clave - de ahí el nombre, KeyError
.
Causas comunes y ejemplos de Python KeyError
Veamos un ejemplo utilizando un diccionario de países y sus capitales:
dictionary_capitals = {'Madrid': 'Spain',
'Lisboa': 'Portugal', 'London': 'United Kingdom'}
Para buscar información en nuestro diccionario, debemos especificar la clave entre paréntesis y Python nos devolverá el valor asociado.
dictionary_capitals['Madrid']
'Spain'
Si intentamos acceder a una clave que no está en el diccionario, Python nos dará el mensaje de error de excepción KeyError
.
dictionary_capitals['Rome']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Rome'
También podríamos encontrarnos con la excepción KeyError
cuando intentamos acceder a claves inexistentes en otros objetos de mapeo de Python que adoptan la forma de diccionario. Por ejemplo, el objeto os.environ
devuelve un diccionario que almacena las variables de entorno del usuario como claves junto con sus valores asociados.
En el siguiente código, intentamos acceder al valor asociado a la clave USERS
en el diccionario os.environ
. Como USERS
no estaba en el diccionario os.environ
, nuestro código nos da un KeyError
.
#Calling a non-existent environmental variable
os.environ['USERS']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/os.py", line 679, in __getitem__
raise KeyError(key) from None
KeyError: 'USERS'
Resulta que los diccionarios son muy comunes en Python. Otro ejemplo es la implementación de algo más abstracto llamado hashmap. Echa un vistazo a nuestro tutorial Guía de Python Hashmaps para aprender más acerca de hashmaps.
Manejo de excepciones Python KeyError
Exploremos los métodos para gestionar las excepciones de KeyError
. Tenemos dos estrategias: Podríamos evitar KeyError
o atrapar KeyError
con la gestión de errores.
Prevención de KeyError
Como hemos visto, Python lanzará un KeyError
si intentamos acceder a una clave inexistente. Para evitarlo, podemos acceder a las claves de un diccionario utilizando el método .get()
para que nuestro código sea más indulgente. Si al utilizar este método nos encontramos con una clave inexistente, Python devolverá un valor None
en lugar de KeyError
. Este es un buen enfoque.
print(dictionary_capitals.get('Prague'))
None
Alternativamente, podríamos comprobar si una clave existe antes de acceder a ella. Esta forma de evitar excepciones se conoce como “Look Before You Leap" (mirar antes de saltar), o LBYL, por sus siglas en inglés. En este caso, podríamos utilizar las sentencias if
para comprobar si la clave existe y, si no existe, podemos tratar el problema en la cláusula else
.
capital = "Prague"
if capital in dictionary_capitals.keys():
value = dictionary_capitals[capital]
else:
print("The key {} is not present in the dictionary".format(capital))
Captura de KeyError con manejo de excepciones
Un segundo enfoque se conoce como “Easier to Ask Forgiveness Than Permission." (es más fácil pedir perdón que permiso). EAFP, como se llama, es en realidad la forma más estándar de manejar excepciones en Python.
Adoptar el estilo de codificación EAFP significa que asumimos la existencia de claves válidas y capturamos excepciones si la suposición resulta falsa. Mientras que nuestro enfoque LBYL se basa en sentencias if/else, el enfoque EAFP se basa en cláusulas try/except.
En el siguiente ejemplo, en lugar de comprobar si la clave está presente, intentamos acceder a la clave deseada. Si, por alguna razón, la clave no está presente, entonces simplemente atrapamos el KeyError
en la cláusula except y lo manejamos apropiadamente.
capital = "Prague"
try:
value = dictionary_capitals[capital]
except KeyError:
print("The key {} is not present in the dictionary".format(capital))
Gestión avanzada de errores clave en Python
Uso de defaultdict para la gestión automática de claves
Vemos que, cada vez que intentamos acceder a una clave que no está presente en nuestro diccionario, Python devolverá una excepción KeyError
. El método .get()
que revisamos era un enfoque tolerante a errores que funcionaba bien, pero que no estaba optimizado.
El módulo Collections
ofrece defaultdict
, que es un enfoque más optimizado para manejar las entradas del diccionario. A diferencia de los diccionarios estándar que lanzan un KeyError
si intentamos acceder a una clave inexistente, un defaultdict
nos permite especificar un valor por defecto que se devuelve siempre que no se encuentra una clave. El siguiente código nos muestra cómo importar defaultdict
desde Collections
y crear un valor por defecto con una función lambda
. Si tienes dudas sobre las funciones lambda, echa un vistazo a nuestro Tutorial sobre lambda en Python para aprender más.
from collections import defaultdict
# Defining the dict
capitals = defaultdict(lambda: "The key doesn't exist")
capitals['Madrid'] = 'Spain'
capitals['Lisboa'] = 'Portugal'
print(capitals['Madrid'])
print(capitals['Lisboa'])
print(capitals['Ankara'])
Spain
Portugal
The key doesn't exist
Generar KeyError de manera deliberada
Por último, hay que decir que, en algunas circunstancias, puede ser conveniente plantear deliberadamente una KeyError
para imponer ciertas restricciones.
Sabemos que, en muchos casos, las funciones dependen de la disponibilidad de datos específicos para realizar sus operaciones. Por tanto, la activación manual de KeyError
garantiza que la función falle de forma clara y predecible cuando falten los datos necesarios. En estos casos, el mensaje de error proporcionado con la dirección KeyError
nos ayuda a entender exactamente qué es lo que estaba mal en la entrada proporcionada, lo que facilita la depuración.
Aclarémoslo con un ejemplo. Aquí hemos creado una función que toma un diccionario como argumento. El usuario debe proporcionar al diccionario las claves adecuadas para que la función funcione correctamente. Creamos una función en este caso porque queremos saber de inmediato si faltan las claves, en lugar de dejar que los errores persistan más adelante en el código.
def my_function(my_dict):
if 'critical_key' not in my_dict:
raise KeyError('critical_key is missing from the dictionary. Please modify the dictionary')
Conclusión
Esperamos que hayas disfrutado de este artículo. KeyError
es una de las excepciones más comunes con las que se encontrará un desarrollador de Python. Dominar el arte de la gestión de errores y excepciones es una parte clave para convertirse en un programador consolidado de Python. Consigue más información sobre otras técnicas de programación funcional y otros fundamentos de codificación con nuestros cursos de programación en Python y fundamentos de Python. Además, echa un vistazo a nuestro tutorial de Conjuntos en Python y teoría de conjuntos para aprender más sobre los conceptos relacionados.
Aprende Python con DataCamp
Course
Introduction to Object-Oriented Programming in Python
Course