En quoi les "arguments de mots clés" sont-ils différents des arguments classiques? Tous les arguments ne peuvent-ils pas être passés au name=value
lieu d'utiliser la syntaxe positionnelle?
289
En quoi les "arguments de mots clés" sont-ils différents des arguments classiques? Tous les arguments ne peuvent-ils pas être passés au name=value
lieu d'utiliser la syntaxe positionnelle?
Réponses:
Il existe deux concepts connexes, tous deux appelés " arguments de mots clés ".
Du côté appelant, ce que d'autres commentateurs ont mentionné, vous avez la possibilité de spécifier certains arguments de fonction par nom. Vous devez les mentionner après tous les arguments sans nom ( arguments positionnels ), et il doit y avoir des valeurs par défaut pour tous les paramètres qui n'ont pas été mentionnés du tout.
L'autre concept est du côté de la définition de fonction: vous pouvez définir une fonction qui prend les paramètres par nom - et vous n'avez même pas besoin de spécifier quels sont ces noms. Ce sont des arguments de mots clés purs et ne peuvent pas être passés de manière positionnelle. La syntaxe est
Tous les arguments de mots clés que vous transmettez à cette fonction seront placés dans un dictionnaire nommé
kwargs
. Vous pouvez examiner les clés de ce dictionnaire au moment de l'exécution, comme ceci:la source
kwargs
ou je peux le renommer en sth. commeoptions
(def my_fuction(arg1, arg2, **options)
)?kwargs
c'est la convention quand il n'y a pas de nom plus appropriéIl y a une dernière fonction linguistique où la distinction est importante. Considérez la fonction suivante:
L'
*positional
argument stockera tous les arguments de position transmis àfoo()
, sans limite au nombre que vous pouvez fournir.L'
**keywords
argument stockera tous les arguments de mots clés:Et bien sûr, vous pouvez utiliser les deux en même temps:
Ces fonctionnalités sont rarement utilisées, mais elles sont parfois très utiles, et il est important de savoir quels arguments sont positionnels ou mots-clés.
la source
*positional
et**keywords
si nous changeons la définition de fonction commedef foo(arg1, *positional, **keywords):
. Voiciarg1
positionnel et obligatoire. Veuillez noter que positionnel dans la réponse signifie un nombre optionnel et variable d'arguments positionnels.foo(bar=True)
vous pouvez obtenir les valeurs en utilisant lesbar = keywords.pop('bar')
mêmes quebar = keywords.pop('bar', None)
. Pour la valeur par défaut, utilisezbar = keywords.pop('bar', False)
L'utilisation d'arguments de mots clés est la même chose que les arguments normaux, sauf que l'ordre n'a pas d'importance. Par exemple, les deux appels de fonctions ci-dessous sont identiques:
la source
Arguments positionnels
Ils n'ont aucun mot clé devant eux. L'ordre est important!
Arguments des mots clés
Ils ont des mots clés à l'avant. Ils peuvent être dans n'importe quel ordre!
Vous devez également savoir que si vous utilisez des arguments par défaut et négligez d'insérer les mots clés, l'ordre importera alors!
la source
func("bar", 5)
? Et puis dire quehello
obtient sa valeur par défaut de3
.Il existe deux façons d'affecter des valeurs d'argument aux paramètres de fonction, les deux sont utilisées.
Par position. Les arguments positionnels n'ont pas de mots clés et sont attribués en premier.
Par mot-clé. Les arguments de mot-clé ont des mots-clés et sont attribués en second, après les arguments de position.
Notez que vous avez la possibilité d'utiliser des arguments positionnels.
Si vous n'utilisez pas d'arguments positionnels, alors - oui - tout ce que vous avez écrit se révèle être un argument mot-clé.
Lorsque vous appelez une fonction, vous décidez d'utiliser la position, le mot-clé ou un mélange. Vous pouvez choisir de faire tous les mots clés si vous le souhaitez. Certains d'entre nous ne font pas ce choix et utilisent des arguments positionnels.
la source
Je suis surpris que personne ne semble avoir souligné que l'on peut passer un dictionnaire de paramètres d'argument à clé, qui satisfont les paramètres formels, comme ça.
la source
, **kwargs
. Cela démontrerait que même une simple fonction func, avec un nombre fixe de paramètres, peut être fournie avec un dictionnaire. Autrement dit, il ne nécessite rien d'extraordinaire dans la définition. ALORS, vous pouvez ajouter un deuxième exemple, AVEC ** kwargs dans la définition, et montrer comment les éléments EXTRA dans le dictionnaire sont disponibles via cela.print 'a:%s, b:%s, c:%s' % (a, b, c)
donne une erreur de syntaxe, maisprint('a:%s, b:%s, c:%s' % (a, b, c))
fonctionne. Quelque chose avec la version Python? Quoi qu'il en soit, merci pour cette idée, jusqu'à présent, j'utilisais le plus maladroitprint('a:{}, b:{}, c:{}'.format(a, b, c))
En utilisant Python 3, vous pouvez avoir à la fois des arguments de mots clés requis et non requis :
Facultatif : (valeur par défaut définie pour le paramètre 'b')
Obligatoire (aucune valeur par défaut définie pour le paramètre 'b'):
Cela peut aider dans les cas où vous avez de nombreux arguments similaires les uns à côté des autres, surtout s'ils sont du même type, dans ce cas, je préfère utiliser des arguments nommés ou je crée une classe personnalisée si les arguments vont de pair.
la source
Je suis surpris que personne n'ait mentionné le fait que vous pouvez mélanger des arguments de position et de mots clés pour faire des choses sournoises comme celle-ci en utilisant
*args
et**kwargs
(à partir de ce site ):Cela vous permet d'utiliser des arguments de mots clés arbitraires qui peuvent avoir des clés que vous ne souhaitez pas définir à l'avance.
la source
Je cherchais un exemple qui avait des kwargs par défaut en utilisant l'annotation de type:
exemple:
la source
Il suffit de compléter / ajouter un moyen de définir la valeur par défaut des arguments qui ne sont pas attribués en mots clés lors de l'appel de la fonction:
appelez cela par:
tu auras:
en savoir plus sur
*args
et**kwargs
en python: https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3la source