Categorías
Python

Automatización web moderna con Python y selenio

 

Tabla de Contenidos

  • Qué KeyError Python generalmente significa
  • ¿Dónde más puede ver un KeyError Python en la librería estándar
  • cuando se necesita para criar a un KeyError Python en su propio código
  • Cómo manejar un KeyError Python Cuando You See ItThe solución habitual: .get () La solución Raras: Comprobación de KeysThe Solución general: try excepto
  • La solución habitual: .get ()
  • La solución Raras: Comprobación de llaves
  • la solución general: try excepto
  • Conclusión

  • The usual Solución: .get ()
  • la solución Raras: Comprobación de llaves
  • la solución general: try excepto

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del real Python . Mira que junto con el tutorial escrito para profundizar su comprensión: Excepciones Python KeyError y forma de abordarlos excepción KeyError de

Python es una excepción común encontrado por los principiantes. Saber por qué un KeyError se puede subir y algunas soluciones para evitar que se detenga su programa son pasos esenciales para mejorar como programador de Python.

Al final de este tutorial, usted sabrá:

  • Qué KeyError Python normalmente significa
  • Dónde más puede ver un KeyError en la biblioteca estándar
  • Como manejar un KeyError cuando lo ves
  • Bono

gratuito: Haga clic aquí para obtener nuestro libre Hoja de trucos Python que le muestra los conceptos básicos de Python 3, como trabajar con tipos de datos, diccionarios, listas y funciones de Python.

Qué excepción Python KeyError por lo general significa

Un KeyError Python es lo que se genera cuando se intenta acceder a una clave que no se encuentra en un diccionario (dict). documentación oficial de Python

dice que el KeyError se eleva cuando se accede a una asignación de teclas y no se encuentra en el mapeo. Un mapeo es una estructura de datos que se asigna un conjunto de valores a otro. El mapeo más común en Python es el diccionario.

El KeyError Python es un tipo de excepción y LookupError denota que no era una cuestión de recuperar la clave que estaba buscando. Cuando vea un KeyError, el significado semántico es que la clave se buscó no se pudo encontrar.

En el siguiente ejemplo, se puede ver un diccionario (edades) se define con las edades de tres personas. Al intentar acceder a una clave que no está en el diccionario, un KeyError se eleva:

>>> ages = {'Jim': 30, 'Pam': 28, 'Kevin': 33}
>>> ages['Michael']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'Michael'

Aquí, el intento de acceder a la clave ‘Michael’ en las edades resultados del diccionario en un KeyError siendo criados. En la parte inferior del rastreo, se obtiene la información relevante:

  • El hecho de que un KeyError se elevó
  • La llave que no se pudo encontrar, que era ‘Michael’

La segunda a la última línea dice que la línea que produce la excepción. Esta información es más útil cuando se ejecuta el código Python desde un archivo.

Nota: Cuando se produce una excepción en Python, que se realiza con un rastreo . El rastreo le da toda la información relevante para poder determinar por qué la excepción fue levantado y lo que lo causó.

aprender a leer una retraza de Python y la comprensión de lo que está diciendo es crucial para mejorar como programador de Python.

En el siguiente programa, se puede ver las edades diccionario definido de nuevo. Esta vez, se le pedirá que proporcione el nombre de la persona para recuperar la edad para:

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.')

Este código se tome el nombre que proporciona en el indicador y el intento de recuperar la edad para esa persona. Lo que se teclea en el indicador de se utilizará como clave para las edades de diccionario, en la línea 4.

Repitiendo el ejemplo no desde arriba, obtenemos otra de rastreo, esta vez con información acerca de la línea en el archivo que el KeyError es resucitado de entre:

$ 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'

el programa falla cuando se le da una llave que no está en el diccionario. Aquí, últimas líneas del rastreo apuntan al problema. Archivo «ages.py», línea 4, en le indica qué línea de qué archivo produce la excepción KeyError resultante. A continuación, se muestran esa línea. Por último, la excepción KeyError proporciona la clave que falta.

Así se puede ver que la última línea del rastreo KeyError no le da suficiente información sobre su cuenta, pero las líneas antes de que se puede obtener mucho más cerca de la comprensión de lo que salió mal.

Nota: Al igual que el ejemplo anterior, la mayoría de los otros ejemplos en este tutorial de hacer uso de aviones F-cuerdas, que se introdujeron en Python 3.6.

¿Dónde más puede ver un KeyError Python en la Norma Biblioteca

La gran mayoría de las veces, un KeyError Python se eleva debido a una clave no se encuentra en un diccionario o una subclase diccionario (como os.environ).

En casos raros, también se puede ver que se crió en otros lugares en la biblioteca estándar de Python, como en el módulo de archivo zip, si un artículo no se encuentra en un archivo ZIP. Sin embargo, estos lugares conservan el mismo significado semántico de la KeyError Python, que no está encontrando la clave solicitada.

En el siguiente ejemplo, se puede ver utilizando la clase zipfile.ZipFile para extraer información acerca de un archivo ZIP usando .getinfo ():

>>> 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 "/patho/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"

Esto no parece realmente una búsqueda clave de diccionario. En su lugar, se trata de una llamada a zipfile.ZipFile.getinfo () que plantea la excepción.

El rastreo también se ve un poco diferente con un poco más de información dado que sólo la clave que falta: KeyError: «No hay ningún elemento denominado ‘algo’ en el archivo».

La última cosa a tener en cuenta es que la línea que planteó la KeyError no está en su código. Es en el código zip, pero las líneas anteriores del rastreo indica qué líneas en el código de la causa del problema.

cuando se necesita para criar a un KeyError Python en su propio código

Puede haber momentos en los que tiene sentido traer a colación una excepción de Python KeyError en su propio código. Esto se puede hacer mediante el uso de la palabra clave aumento y llamando la excepción KeyError:

raise KeyError(message)

Por lo general, el mensaje sería la clave que falta. Sin embargo, como en el caso del paquete zip, se puede optar por darle un poco más de información para ayudar a la próxima desarrollador a entender mejor lo que salió mal.

Si deciden criar a un KeyError Pitón en su propio código, simplemente asegúrese de que su caso de uso coincide con el significado semántico detrás de la excepción. Cabe indicar que la clave se buscó no se pudo encontrar.

Cómo manejar un KeyError Python cuando lo ves

cuando se encuentra con un KeyError, hay algunas formas estándar para manejarlo. Dependiendo de su caso de uso, algunas de estas soluciones podría ser mejor que los demás. El objetivo final es dejar de excepciones KeyError inesperados de ser levantada.

La solución habitual: .get ()

Si el KeyError se eleva desde una búsqueda de claves diccionario fracasado en su propio código, se puede utilizar .get () para devolver el valor ya sea encontrar en la clave especificada o un valor predeterminado.

Al igual que el ejemplo de recuperación de la edad de antes, el siguiente ejemplo muestra una mejor manera de obtener la edad del diccionario utilizando la clave proporcionada en el indicador:

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.")

Aquí, la línea 5 muestra cómo se puede obtener el valor de la edad de las edades usando .get (). Esto dará lugar a la variable edad que tenga el valor de edad encontrado en el diccionario de la llave suministrada o un valor predeterminado, Nada en este caso.

Esta vez, no se obtiene una excepción KeyError elevada debido a la utilización del método más seguro .get () para obtener la edad en lugar de intentar acceder a la clave directamente:

$ python ages.py
Get age for: Michael
Michael's age is unknown.

En la ejecución ejemplo anterior, el KeyError está ya no se levantó cuando se proporciona una mala llave. La clave ‘Michael’ no se encuentra en el diccionario, pero mediante el uso de .get (), obtenemos una Ninguno regresó en lugar de un KeyError elevada.

La variable edad, o bien tener la edad de la persona encontraron en el diccionario o el valor por defecto (por defecto ninguno). También puede especificar un valor predeterminado diferente en la llamada .get () pasando un segundo argumento.

Se trata de la línea 5 del ejemplo anterior con una edad predeterminada diferente especificado utilizando .get ():

age = ages.get(person, 0)

Aquí, en lugar de ‘Michael’ Ninguno de regresar, volvería 0 porque no se encuentra la clave y el valor predeterminado valor de retorno es 0. ahora

la solución Raras: Comprobación de llaves

Hay momentos en que es necesario determinar la existencia de una clave en un diccionario. En estos casos, el uso de .get () no le puede dar la información correcta. Conseguir una Ninguno de regresar de una llamada a .get () podría significar que la clave no se ha encontrado o que el valor encontrado en la clave del diccionario es en realidad Ninguno.

Con un diccionario o un diccionario-como objeto, puede utilizar el operador in para determinar si una llave está en la asignación. Este operador devuelve un valor booleano (verdadero o falso) que indica si la clave se encuentra en el diccionario.

En este ejemplo, que está recibiendo un diccionario respuesta de llamar a una API. Esta respuesta podría tener un valor de clave de error definido en la respuesta, lo que indicaría que la respuesta está en un estado de error:

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

Aquí, hay una diferencia en la comprobación para ver si existe la clave de error en la respuesta y la obtención de un valor predeterminado el valor de la clave. Este es un caso raro donde lo que en realidad se está buscando es si la clave está en el diccionario y no lo que el valor en esa clave es.

la solución general: try excepto

Al igual que con alguna excepción, siempre se puede utilizar la prueba, excepto el bloque para aislar el código de excepción potencial de sensibilización y proporcionar una solución de copia de seguridad.

Puede utilizar el intento, excepto bloque en un ejemplo similar al anterior, pero esta vez proporcionar un mensaje predeterminado a imprimir se debe levantar un KeyError en el caso normal:

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.")

Aquí, se puede ver el caso normal en el intento bloquear la impresión del nombre y la edad de la persona. El caso de copia de seguridad se encuentra en el bloque de excepción, en el que si un KeyError se eleva en el caso normal, entonces el caso de copia de seguridad es imprimir un mensaje diferente.

El intento excepto solución de bloqueo es también una gran solución para otros lugares que no sean compatibles con .get () o el operador in. También es la mejor solución si el KeyError está siendo levantado de código de otra persona.

Aquí hay un ejemplo usando el paquete zip de nuevo. Esta vez, el intento excepto bloque nos da una manera de detener la excepción KeyError de detener el programa:

>>> 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"

Puesto que la clase ZipFile no proporciona .get (), al igual que lo hace el diccionario, es necesario utilizar el try excepto solución. En este caso, usted no tiene que saber de antemano qué valores son válidos para pasar a .getinfo ().

Conclusión

Ahora ya sabe algunos lugares comunes donde excepción KeyError de Python podría elevarse y algunos grandes soluciones que puede utilizar para evitar que se detenga su programa.

Ahora, la próxima vez que vea un KeyError levantó, se sabrá que es probable que sea sólo un mal diccionario de búsqueda de claves. También podrá encontrar toda la información que necesita para determinar dónde viene el error de mirar las últimas líneas de la traza.

Si el problema es una búsqueda de clave de diccionario en su propio código, a continuación, puede cambiar el acceso a la clave directamente en el diccionario a usar el método más seguro .get () con un valor de retorno por defecto. Si el problema no viene de su propio código, a continuación, utilizando la prueba, excepto bloque es la mejor opción para controlar el flujo de su código. Excepciones

no tienen que dar miedo. Una vez que sepa cómo entender la información proporcionada a usted en sus rastreos y la causa de la excepción, entonces usted puede utilizar estas soluciones para hacer sus programas de flujo más predecible.

Mira ahora Este tutorial tiene un vídeo relacionado curso creado por el equipo del Real Python. Mira que junto con el tutorial escrito para profundizar su comprensión: Excepciones Python KeyError y forma de abordarlos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *