Python 3.2.3. Había algunas ideas enumeradas aquí , que funcionan en var regulares, pero parece que ** kwargs juegan con reglas diferentes ... entonces, ¿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? ¿Tengo que recorrerlo solo para comprobar si hay una clave en particular?
python
dictionary
python-3.x
kwargs
Zamphatta
fuente
fuente
Respuestas:
Usted quiere
Para obtener el valor de
errormessage
De esta forma,
kwargs
es solo otrodict
. Su primer ejemplo,if kwargs['errormessage']
significa "obtenga el valor asociado con la clave" mensaje de error "en kwargs, y luego verifique su valor bool". Entonces, si no existe tal clave, obtendrá unKeyError
.Su segundo ejemplo,
if errormessage in kwargs:
significa "sikwargs
contiene el elemento nombrado por"errormessage
", y a menos que"errormessage
"sea el nombre de una variable, obtendrá unNameError
.Debo mencionar que los diccionarios también tienen un método
.get()
que acepta un parámetro predeterminado (en sí mismo predeterminadoNone
), por lo quekwargs.get("errormessage")
devuelve el valor si esa clave existe y de loNone
contrario (de manera similar,kwargs.get("errormessage", 17)
hace lo que podría pensar que hace). Cuando no le importa la diferencia entre la clave existente y que tieneNone
como valor o la clave no existe, esto puede ser útil.fuente
kwargs.get("errormessage", 17)
podría devolver su valor o17
si el mensaje de error no existe, pero no estoy seguro. ¿Es eso correcto?Las respuestas de DSM y Tadeck responden directamente a su pregunta.
En mis scripts a menudo uso lo conveniente
dict.pop()
para tratar con argumentos opcionales y adicionales. Aquí hay un ejemplo de unprint()
contenedor simple :Luego:
Como puede ver, si
prefix
no está contenido enkwargs
, entonces el valor predeterminado''
(cadena vacía) se almacena en laprefix
variable local . Si se da, se está utilizando su valor.Esta es generalmente una receta compacta y legible para escribir envoltorios para cualquier tipo de función: siempre solo pasa argumentos que no entiendes y ni siquiera sabes si existen. Si siempre pasa
*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 casoprint
) cambian, no necesita cambiar su código. Este enfoque reduce el tiempo de desarrollo al tiempo que admite todos los cambios de interfaz.fuente
prefix
.Es solo esto:
Debe verificar si la clave está en el diccionario. La sintaxis para eso es
some_key in some_dict
(dondesome_key
hay algo que se pueda tener con hash, 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
locals()
yglobals()
. Su ejemplo es similar, porque está verificando la existencia de una clave específica en elkwargs
diccionario (el diccionario que contiene argumentos de palabras clave).fuente
¡Una forma es agregarlo usted mismo! ¿Cómo? Al fusionarse
kwargs
con un montón de valores predeterminados. Esto no será apropiado en todas las ocasiones, por ejemplo, si no conoce las claves de antemano. Sin embargo, si lo son, aquí hay un ejemplo simple:Los valores predeterminados se establecen en el diccionario
args
, que incluye todas las claves que esperamos. Primero verificamos si hay claves inesperadas en kwargs. Luego actualizamosargs
conkwargs
lo que sobrescribirá los nuevos valores que el usuario haya establecido. No necesitamos probar si existe una clave, ahora la usamosargs
como diccionario de argumentos y no necesitamos máskwargs
.fuente
Puedes descubrir esas cosas fácilmente por ti mismo:
fuente
in
operador en sí mismo no es fácil si nunca ha programado y / o es nuevo en Python. Solo se insinúa endict.get()
ydict.setdefault()
ayuda.fuente