Saltar al contenido principal
InicioTutorialesPython

Excepciones KeyError en Python y cómo solucionarlas

Aprende técnicas clave como el manejo de excepciones y la prevención de errores para manejar eficazmente la excepción KeyError en Python.
Actualizado 28 jun 2024  · 6 min leer

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. 

Temas

Aprende Python con DataCamp

Course

Writing Efficient Python Code

4 hr
121.4K
Learn to write efficient code that executes quickly and allocates resources skillfully to avoid unnecessary overhead.
See DetailsRight Arrow
Start Course
Ver másRight Arrow