Que fait un astérisque nu dans les arguments d'une fonction?
Quand j'ai regardé le module de cornichon , je vois ceci:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
Je connais un astérisque simple et double précédant les arguments (pour un nombre variable d'arguments), mais cela ne précède rien. Et je suis presque sûr que cela n'a rien à voir avec les cornichons. Ce n'est probablement qu'un exemple de cela. Je n'ai appris son nom qu'en envoyant ceci à l'interprète:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
Si cela importe, je suis sur python 3.3.0.
Réponses:
Bare
*
est utilisé pour forcer l'appelant à utiliser des arguments nommés - vous ne pouvez donc pas définir une fonction avec*
comme argument lorsque vous n'avez aucun argument de mot clé suivant.Consultez cette réponse ou la documentation Python 3 pour plus de détails.
la source
*args
, doivent se produire avant le bare*
.*
est à la place de*args
, et vice-versa; ils ne peuvent pas coexister dans une signature. C'est pourquoi ils ont choisi*
; auparavant,*args
c'était le seul moyen de forcer des arguments purement positionnels, et cela marquait la fin des arguments qui pouvaient être passés positionnellement (car il collectait tous les arguments positionnels restants, ils pouvaient atteindre les arguments nommés suivants).*
signifie les mêmes "arguments positionnels ne peuvent pas aller plus loin ici", mais l'absence de nom signifie "mais je ne les accepterai pas du tout, parce que j'ai choisi de ne pas fournir un endroit pour les mettre".Alors que la réponse d'origine répond complètement à la question, il suffit d'ajouter un peu d'informations connexes. Le comportement de l'astérisque unique dérive de
PEP-3102
. Citant la section connexe:En anglais simple, cela signifie que pour transmettre la valeur de la clé, vous devrez la transmettre explicitement sous la forme
key="value"
.la source
*
est d'avaler les arguments positionnels restants, mais ce n'est pas le cas. Le passage d'arguments positionnels supplémentaires que la fonction attend, donne une erreur de ce type:foo() takes exactly 1 positional argument (2 given)
l'exemple ci-dessus avec ** kwargs
la source
Sémantiquement, cela signifie que les arguments qui le suivent sont uniquement des mots clés, vous obtiendrez donc une erreur si vous essayez de fournir un argument sans spécifier son nom. Par exemple:
De manière pragmatique, cela signifie que vous devez appeler la fonction avec un argument mot-clé. Cela se fait généralement lorsqu'il est difficile de comprendre le but de l'argument sans l'indication donnée par le nom de l'argument.
Comparez par exemple
sorted(nums, reverse=True)
vs si vous avez écritsorted(nums, True)
. Ce dernier serait beaucoup moins lisible, donc les développeurs Python ont choisi de vous faire l'écrire à l'ancienne.la source
Supposons que vous ayez une fonction:
Vous pouvez appeler cette fonction de 2 manières:
sum(1,2)
ousum(1,key=2)
Supposons que vous souhaitiez que la fonction
sum
soit appelée uniquement à l'aide d'arguments de mots clés.Vous ajoutez
*
à la liste des paramètres de fonction pour marquer la fin des arguments positionnels.Donc fonction définie comme:
peut être appelé uniquement en utilisant
sum(1,key=2)
la source
J'ai trouvé le lien suivant très utile pour expliquer
*
,*args
et**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
Essentiellement, en plus des réponses ci-dessus, j'ai appris du site ci-dessus (crédit: https://pythontips.com/author/yasoob008/ ) ce qui suit:
Avec la fonction de démonstration définie ci-dessous, il y a deux exemples, un avec
*args
et un avec**kwargs
*args
Vous permet donc de créer dynamiquement une liste d'arguments qui seront pris dans l'ordre dans lequel ils sont alimentés, tandis que**kwargs
peut permettre le passage d'arguments NAMED et peut être traité par NAME en conséquence (quel que soit l'ordre dans lequel ils sont alimentés) .Le site continue, notant que l'ordre correct des arguments doit être:
la source