À quoi servent **kwargs
en Python?
Je sais que vous pouvez faire un objects.filter
sur une table et passer un **kwargs
argument.
Puis-je également le faire pour spécifier les deltas de temps, c'est timedelta(hours = time1)
-à- dire ?
Comment ça marche exactement? Est-ce que les classes sont «déballées»? Comme a,b=1,2
?
kwargs
signifieKeyWord ARGumentS
, c'est-à-dire des arguments qui ont défini des clésRéponses:
Vous pouvez utiliser
**kwargs
pour laisser vos fonctions prendre un nombre arbitraire d'arguments de mot-clé ("kwargs" signifie "arguments de mot-clé"):Vous pouvez également utiliser le
**kwargs
syntaxe lors de l'appel de fonctions en construisant un dictionnaire d'arguments de mots clés et en le transmettant à votre fonction:le didacticiel Python contient une bonne explication de son fonctionnement, ainsi que de beaux exemples.
<--Mise à jour-->
Pour les personnes utilisant Python 3, au lieu de iteritems (), utilisez items ()
la source
Déballage des dictionnaires
**
décompresse les dictionnaires.Cette
est le même que
C'est utile si vous devez construire des paramètres:
Paramètres d'emballage d'une fonction
Cela vous permet d'utiliser la fonction comme ceci:
la source
** do unpack dictionaries.
>> époustouflant / bien sûr! +1 pour expliquer ce bit..iteritems()
a été renommé.items()
en Python 3.kwargs est juste un dictionnaire qui est ajouté aux paramètres.
Un dictionnaire peut contenir des paires clé / valeur. Et ce sont les kwargs. Ok, c'est comme ça.
Le pourquoi n'est pas si simple.
Par exemple (très hypothétique), vous avez une interface qui appelle simplement d'autres routines pour faire le travail:
Vous obtenez maintenant une nouvelle méthode "drive":
Mais attendez une minute, il y a un nouveau paramètre "véhicule" - vous ne le saviez pas auparavant. Vous devez maintenant l'ajouter à la signature de la fonction myDo.
Ici, vous pouvez lancer des kwargs en jeu - vous ajoutez simplement des kwargs à la signature:
De cette façon, vous n'avez pas besoin de changer la signature de votre fonction d'interface à chaque fois que certaines de vos routines appelées peuvent changer.
Ceci est juste un bel exemple que vous pourriez trouver utile pour kwargs.
la source
Partant du principe qu'un bon échantillon est parfois meilleur qu'un long discours, j'écrirai deux fonctions en utilisant toutes les facilités de passage d'arguments variables python (à la fois des arguments positionnels et nommés). Vous devriez facilement pouvoir voir ce qu'il fait par vous-même:
Et voici la sortie:
la source
Motif:
*args
et**kwargs
sert d'espace réservé pour les arguments qui doivent être passés à un appel de fonctionen utilisant
*args
et**kwargs
pour appeler une fonctionNous allons maintenant utiliser
*args
pour appeler la fonction définie ci-dessusrésultat:
arg1: deux
arg2: 3
arg3: 5
Maintenant, utiliser
**kwargs
pour appeler la même fonctionrésultat:
arg1: 5
arg2: deux
arg3: 3
Bottomline:
*args
n'a aucune intelligence, il interpole simplement les arguments passés aux paramètres (de gauche à droite) tout en**kwargs
se comportant intelligemment en plaçant la valeur appropriée @ l'endroit requisla source
kwargs
dans**kwargs
est juste un nom de variable. Vous pouvez très bien avoir**anyVariableName
kwargs
signifie "arguments de mots clés". Mais je pense qu'ils devraient être mieux appelés comme "arguments nommés", car ce sont simplement des arguments transmis avec des noms (je ne trouve aucune signification au mot "mot-clé" dans le terme "arguments de mot-clé". Je suppose que "mot-clé" signifie généralement mots réservés par le langage de programmation et donc ne pas être utilisés par le programmeur pour les noms de variables. Rien de tel ne se passe ici en cas de kwargs.). Donc , nous donnons des nomsparam1
etparam2
à deux valeurs de paramètres transmis à la fonction comme suit:func(param1="val1",param2="val2")
, au lieu de passer uniquement les valeurs:func(val1,val2)
. Ainsi, je pense qu'ils devraient être appelés de façon appropriée "nombre arbitraire d'arguments nommés" car nous pouvons spécifier n'importe quel nombre de ces paramètres (c'est-à-dire,func
func(**kwargs)
Cela étant dit, permettez-moi d'abord d'expliquer les "arguments nommés", puis "le nombre arbitraire d'arguments nommés"
kwargs
.Arguments nommés
Exemple
Nombre arbitraire d'arguments nommés
kwargs
Exemple
Passer des variables tuple et dict pour les arguments personnalisés
Pour terminer, permettez-moi également de noter que nous pouvons passer
Ainsi, le même appel ci-dessus peut être effectué comme suit:
Enfin, notez
*
et**
dans les appels de fonction ci-dessus. Si nous les omettons, nous pourrions obtenir de mauvais résultats.Omettre
*
dans les arguments de tuple:impressions
Le tuple ci-dessus
('custom param1', 'custom param2', 'custom param3')
est imprimé tel quel.Omettre les
dict
arguments:donne
la source
keyword
terminologie vient du fait que vous passez dans un dict qui est une base de données de paires clé-valeur.En complément, vous pouvez également mélanger différentes manières d'utilisation lors de l'appel des fonctions kwargs:
donne cette sortie:
Notez que ** kwargs doit être le dernier argument
la source
kwargs est un sucre syntaxique pour passer des arguments de nom en tant que dictionnaires (pour func), ou des dictionnaires en tant qu'arguments nommés (pour func)
la source
Voici une fonction simple qui sert à expliquer l'utilisation:
Tous les arguments qui ne sont pas spécifiés dans la définition de la fonction seront placés dans la
args
liste ou lakwargs
liste, selon qu'il s'agit d'arguments de mots clés ou non:Si vous ajoutez un argument de mot clé qui n'est jamais transmis à une fonction, une erreur sera générée:
la source
Voici un exemple que j'espère utile:
Lorsque vous exécutez le programme, vous obtenez:
La clé à retenir ici est que le nombre variable d'arguments nommés dans l'appel se traduit par un dictionnaire dans la fonction.
la source
Ceci est l'exemple simple à comprendre sur le déballage de python ,
eg1:
la source
En Java, vous utilisez des constructeurs pour surcharger les classes et autoriser plusieurs paramètres d'entrée. En python, vous pouvez utiliser kwargs pour fournir un comportement similaire.
exemple java: https://beginnersbook.com/2013/05/constructor-overloading/
exemple de python:
juste une autre façon d'y penser.
la source
Les arguments de mots clés sont souvent raccourcis en kwargs en Python. En programmation informatique ,
L'utilisation des deux astérisques avant le nom du paramètre, ** kwargs , est quand on ne sait pas combien d'arguments de mot-clé seront passés dans la fonction. Dans ce cas, cela s'appelle Arguments de mots-clés arbitraires / génériques.
Un exemple de ceci est les fonctions de récepteur de Django .
Notez qu'il ne doit pas être appelé kwargs , mais il doit avoir ** (le nom kwargs est une convention).
la source