Lorsque je programme Python, je fais parfois **
une conversion. Je comprends ce qu’il fait, mais quelles structures de données est-ce que je manipule? A dict
et quel est l'autre? Un array
? Y a-t-il un nom pour l' **
opérateur?
python
operators
type-conversion
Niklas Rosencrantz
la source
la source
**
. Power et "dictionnaire d'arguments de mots clés". De quoi parlez-vous? La documentation contient les mots suivants: "Si le formulaire“ ** identificateur ”est présent, il est initialisé dans un nouveau dictionnaire recevant les arguments de mot clé en excès, avec par défaut un nouveau dictionnaire vide." Lesquels d’entre eux semblent pertinents à votre question?Réponses:
Ce n'est pas un opérateur en tant que tel, donc il n'a pas vraiment de nom, mais il est défini comme une "règle syntaxique" . Donc, il devrait s'appeler:
Si vous avez une liste d'arguments,
*args
on l'appelle "décompression d'argument" , de la même manière**kwargs
on l'appelle "décompression d'argument de mot clé" .Si vous l'utilisez sur le côté gauche d'un
=
, comme dansa, *middle, end = my_tuple
, vous diriez "déballage des tuples" .Au total, il existe trois types d'arguments (paramètre unique):
L'
*args
argument est appelé "paramètre de position variable" et**kwargs
est le "paramètre de mot clé variable". Les arguments ne contenant que des mots-clés ne peuvent pas être donnés positionnellement, car un paramètre de position variable prendra tous les arguments que vous transmettez.La plupart de ces informations se trouvent dans les PEP 0362 et 3102 , ainsi que dans la section Flux de contrôle de la documentation. Il convient toutefois de noter que l'objet de signature de fonction PEP n'est qu'un brouillon et que la terminologie peut n'être que l'idée d'une personne. Mais ce sont de bonnes conditions quand même. :)
Ainsi, les arguments
*
et**
ne font que décompresser leurs structures de données respectives:[1]: Iterables sont des objets qui implémentent la
__iter__()
méthode et les mappages sont des objets qui implémententkeys()
et__getitem__()
. Tout objet prenant en charge ce protocole sera compris par les constructeurstuple()
etdict()
pourra donc être utilisé pour décompresser les arguments.la source
def f(x, *xs, y=0): pass
syntaxe {5,6,7} de Python 2 n'est pas valide, ni nedef f(x, y=0, *xs):
fait ce que vous pourriez attendre. Autant que je sache, le seul moyen d’obtenir l’effet (évidemment) recherché estdef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. Python 3 gère la syntaxe d'origine comme prévu.begin, *middle, end = (0, 1, 2, 3, 4, 5)
syntaxe ne fonctionne pas non plus dans Python 2.x.Je ne pense pas qu'il a un nom. Dans les documents Python sous "Unpacking Argument Lists", il est simplement appelé "l'
**
opérateur".Je ne suis pas sûr de ce que vous entendez par "l'autre" structure de données. Lorsque vous
f(**kwargs)
décompressez le dictionnaire enkwargs
tant que séquence de paires clé-valeur. Je ne vois pas qu'il y a une autre structure impliquée.Je vais copier l' exemple de la documentation ci-dessus pour plus de clarté.
Voir aussi: Que signifient * args et ** kwargs?
la source
f(**kwargs)
...Si vous ne savez pas comment appeler un opérateur particulier ou s'il n'a pas été nommé, vous pouvez toujours recourir à Waka Waka Bang Splat comme référence pour vous aider à comprendre comment l'appeler. Dans ce cas,
**
je l'appelleraisdouble-splat
, bien qu'il existe d' autres noms pour les symboles .la source