Python 3.2.3. Il y avait quelques idées énumérées ici , qui fonctionnent sur les var régulières, mais il semble que les ** kwargs jouent selon des règles différentes ... alors pourquoi cela ne fonctionne-t-il pas et comment puis-je vérifier si une clé dans ** kwargs existe?
if kwargs['errormessage']:
print("It exists")
Je pense aussi que cela devrait fonctionner, mais ce n'est pas le cas -
if errormessage in kwargs:
print("yeah it's here")
Je suppose que kwargs est itérable? Dois-je le parcourir simplement pour vérifier si une clé particulière est présente?
python
dictionary
python-3.x
kwargs
Zamphatta
la source
la source
Réponses:
Tu veux
Pour obtenir la valeur de
errormessage
De cette façon,
kwargs
est juste un autredict
. Votre premier exemple,if kwargs['errormessage']
signifie "obtenir la valeur associée à la clé" message d'erreur "dans kwargs, puis vérifier sa valeur booléenne". Donc, s'il n'y a pas de clé, vous obtiendrez un fichierKeyError
.Votre deuxième exemple,
if errormessage in kwargs:
signifie "sikwargs
contient l'élément nommé par"errormessage
", et à moins que"errormessage
"soit le nom d'une variable, vous obtiendrez unNameError
.Je dois mentionner que les dictionnaires ont également une méthode
.get()
qui accepte un paramètre par défaut (lui-même par défautNone
), de sorte quekwargs.get("errormessage")
retourne la valeur si cette clé existe etNone
sinon (fait de mêmekwargs.get("errormessage", 17)
ce que vous pourriez penser qu'elle fait). Lorsque vous ne vous souciez pas de la différence entre la clé existante et ayantNone
comme valeur ou la clé inexistante, cela peut être pratique.la source
kwargs.get("errormessage", 17)
pourrait renvoyer sa valeur ou17
si le message d'erreur n'existe pas - mais je ne suis pas sûr. Est-ce exact?Les réponses de DSM et de Tadeck répondent directement à votre question.
Dans mes scripts, j'utilise souvent le pratique
dict.pop()
pour traiter des arguments optionnels et supplémentaires. Voici un exemple deprint()
wrapper simple :Ensuite:
Comme vous pouvez le voir, si
prefix
n'est pas contenu danskwargs
, alors la valeur par défaut''
(chaîne vide) est stockée dans laprefix
variable locale . Si elle est donnée, alors sa valeur est utilisée.C'est généralement une recette compacte et lisible pour écrire des wrappers pour tout type de fonction: il suffit toujours de passer des arguments que vous ne comprenez pas, et que vous ne savez même pas s'ils existent. Si vous passez toujours
*args
et que**kwargs
vous ralentissez votre code et que vous avez besoin d'un peu plus de frappe, mais si les interfaces de la fonction appelée (dans ce casprint
) changent, vous n'avez pas besoin de changer votre code. Cette approche réduit le temps de développement tout en prenant en charge toutes les modifications d'interface.la source
prefix
.C'est juste ceci:
Vous devez vérifier si la clé est dans le dictionnaire. La syntaxe pour cela est
some_key in some_dict
(oùsome_key
est quelque chose de hachable, pas nécessairement une chaîne).Les idées que vous avez liées ( ces idées ) contenaient des exemples permettant de vérifier si une clé spécifique existait dans les dictionnaires renvoyés par
locals()
etglobals()
. Votre exemple est similaire, car vous vérifiez l'existence d'une clé spécifique dans lekwargs
dictionnaire (le dictionnaire contenant des arguments de mot-clé).la source
Une façon est de l'ajouter vous-même! Comment? En fusionnant
kwargs
avec un tas de valeurs par défaut. Cela ne sera pas approprié en toutes occasions, par exemple, si les clés ne vous sont pas connues à l'avance. Cependant, s'ils le sont, voici un exemple simple:Les valeurs par défaut sont définies dans le dictionnaire
args
, qui comprend toutes les clés que nous attendons. Nous vérifions d'abord s'il y a des clés inattendues dans kwargs. Ensuite, nous mettons à jourargs
aveckwargs
qui écrasera toutes les nouvelles valeurs que l'utilisateur a définies. Nous n'avons pas besoin de tester si une clé existe, nous l'utilisons maintenantargs
comme dictionnaire d'arguments et n'en avons plus besoinkwargs
.la source
Vous pouvez découvrir ces choses facilement par vous-même:
la source
in
opérateur en lui-même n'est pas facile si vous n'avez jamais programmé et / ou êtes nouveau sur Python. Ce n'est qu'indiqué dans ledict.get()
etdict.setdefault()
help.la source