¿Cómo comprobar si existe una clave en ** kwargs?

Python 3.2.3. Aquí se enumeran algunas ideas, que funcionan con las variantes normales, pero parece que los kwargs juegan con reglas diferentes … ¿por qué no funciona esto y cómo puedo verificar si existe una clave en ** kwargs?

if kwargs['errormessage']: print("It exists") 

También creo que esto debería funcionar, pero no funciona.

 if errormessage in kwargs: print("yeah it's here") 

Supongo que porque los kwargs es iterable? ¿Tengo que recorrerlo solo para comprobar si hay una clave en particular?

Usted quiere

 if 'errormessage' in kwargs: print("found it") 

Para obtener el valor del errormessage de errormessage

 if 'errormessage' in kwargs: print("errormessage equals " + kwargs.get("errormessage")) 

De esta manera, los kwargs son solo otro dict . Su primer ejemplo, if kwargs['errormessage'] , significa “obtener el valor asociado con la clave” mensaje de error “en kwargs, y luego verifique su valor bool”. Así que si no hay tal clave, obtendrás un KeyError .

Su segundo ejemplo, if errormessage in kwargs: significa “si kwargs contiene el elemento nombrado por” errormessage “, y a menos que” errormessage “sea el nombre de una variable, obtendrá un NameError .

Debo mencionar que los diccionarios también tienen un método .get() que acepta un parámetro predeterminado (el valor predeterminado es None ), por lo que kwargs.get("errormessage") devuelve el valor si esa clave existe y None contrario (similarmente kwargs.get("errormessage", 17) hace lo que usted podría pensar que hace). Cuando no le importa la diferencia entre la clave existente y la que tiene None como un valor o la clave que no existe, esto puede ser útil.

Las respuestas de DSM y Tadeck responden a su pregunta directamente.

En mis scripts a menudo utilizo el conveniente dict.pop() para tratar con argumentos opcionales y adicionales. Aquí hay un ejemplo de una envoltura simple print() :

 def my_print(*args, **kwargs): prefix = kwargs.pop('prefix', '') print(prefix, *args, **kwargs) 

Entonces:

 >>> my_print('eggs') eggs >>> my_print('eggs', prefix='spam') spam eggs 

Como puede ver, si el prefix no está contenido en kwargs , entonces el valor predeterminado '' (cadena vacía) se almacena en la variable de prefix local. Si se da, entonces se está utilizando su valor.

Por lo general, esta es una receta compacta y legible para escribir envoltorios para cualquier tipo de función: siempre es solo los argumentos de paso que no entiendes, y ni siquiera sabes si existen. Si siempre pasa por *args y **kwargs , hace que su código sea más lento y requiere un poco más de escritura, pero si las interfaces de la función llamada (en este caso, print ) cambian, no necesita cambiar su código. Este enfoque reduce el tiempo de desarrollo al tiempo que admite todos los cambios de interfaz.

Es solo esto:

 if 'errormessage' in kwargs: print("yeah it's here") 

Es necesario comprobar, si la clave está en el diccionario. La syntax para eso es some_key in some_dict (donde some_key es algo hashable, no necesariamente una cadena).

Las ideas que ha vinculado ( estas ideas ) contenían ejemplos para verificar si existía una clave específica en los diccionarios devueltos por locals() y globals() . Su ejemplo es similar, porque está verificando la existencia de una clave específica en el diccionario kwargs (el diccionario que contiene argumentos de palabras clave).

Una forma es agregarlo usted mismo! ¿Cómo? Al fusionar kwargs con un montón de valores por defecto. Esto no será apropiado en todas las ocasiones, por ejemplo, si las teclas no se conocen de antemano. Sin embargo, si lo son, aquí hay un ejemplo simple:

 import sys def myfunc(**kwargs): args = {'country':'England','town':'London', 'currency':'Pound', 'language':'English'} diff = set(kwargs.keys()) - set(args.keys()) if diff: print("Invalid args:",tuple(diff),file=sys.stderr) return args.update(kwargs) print(args) 

Los valores predeterminados se establecen en los args del diccionario, que incluyen todas las claves que esperamos. Primero verificamos si hay claves inesperadas en kwargs. Luego, actualizamos los kwargs con kwargs que sobrescribirán los nuevos valores que el usuario haya establecido. No necesitamos probar si existe una clave, ahora usamos args como nuestro diccionario de argumentos y no necesitamos más kwargs .

Puedes descubrir esas cosas fácilmente por ti mismo:

 def hello(*args, **kwargs): print kwargs print type(kwargs) print dir(kwargs) hello(what="world")