variable read python3 explicacion python dictionary python-3.x kwargs

python - read - ¿Cómo verificar si existe una clave en** kwargs?



python3 kwargs (5)

¡Una forma es agregarlo usted mismo! ¿Cómo? Al combinar kwargs con un montón de valores predeterminados. Esto no será apropiado en todas las ocasiones, por ejemplo, si las claves no se conocen con anticipación. 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 el diccionario args , que incluye todas las claves que estamos esperando. Primero verificamos si hay claves inesperadas en kwargs. Luego actualizamos args con kwargs que sobrescribirán cualquier valor nuevo 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 .

Python 3.2.3. Hubo algunas ideas enumeradas aquí , que funcionan en var''s regulares, pero parece que ** kwargs se rigen por 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 es así -

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

Supongo que porque kwargs es iterable. ¿Debo repetirlo solo para verificar si hay una clave en particular?


Es solo esto:

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

Debe verificar si la clave está en el diccionario. La sintaxis 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 comprobar si existía una clave específica en los diccionarios devueltos por los locals() y globals() . Su ejemplo es similar, porque está comprobando la existencia de una clave específica en el diccionario kwargs (el diccionario que contiene argumentos de palabras clave).


Las respuestas de DSM y Tadeck responden su pregunta directamente.

En mis scripts, a menudo uso el conveniente dict.pop() para tratar argumentos opcionales y adicionales. Aquí hay un ejemplo de un contenedor simple de 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 su valor está siendo utilizado.

En general, esta es una receta compacta y legible para escribir envoltorios para cualquier tipo de función: siempre pasa argumentos 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 tipeo, 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.


Puedes descubrir esas cosas fácilmente por ti mismo:

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


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 forma, kwargs es solo otra 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". Entonces, si no hay tal clave, obtendrás un KeyError .

Su segundo ejemplo, if errormessage in kwargs: significa "si kwargs contiene el elemento denominado por" errormessage ", y salvo 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 (de manera similar, kwargs.get("errormessage", 17) hace lo que crees que hace). Cuando no le importa la diferencia entre la clave existente y no tiene None como valor o la clave no existe, esto puede ser útil.