web-dev-qa-db-fra.com

Quel est le nom de ** en python?

Lors de la programmation Python je fais parfois un ** pour effectuer une conversion. Je comprends ce qu'il fait mais quelles structures de données suis-je en train de manipuler? Un dict et quel est l'autre? Un array? Y a-t-il un nom pour le ** opérateur?

59
Niklas

Ce n'est pas un opérateur en tant que tel, donc il n'a pas vraiment a un nom, mais il est défini comme une "règle syntaxique" . Il faut donc l'appeler:

  • "la syntaxe de décompression de l'argument mot clé"

Si vous avez une liste d'arguments, *args, Cela s'appelle "déballage des arguments" , de la même manière **kwargs est appelé "déballage des arguments de mots clés" .

Si vous l'utilisez sur le côté gauche d'un =, Comme dans a, *middle, end = my_Tuple, Vous diriez "Déballage de tuple" .

Au total, il existe trois types d'arguments (à paramètre unique):

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

L'argument *args Est appelé le "paramètre de position variable" et **kwargs Est le "paramètre de mot clé variable". Les arguments de mots clés uniquement ne peuvent pas être donnés de manière positionnelle, car un paramètre de position variable prendra tous les arguments que vous transmettez.

La plupart de ces informations se trouvent dans les PEP 62 et 102 , ainsi que dans la section Control Flow de la documentation. Il convient de noter cependant que l'objet de signature de fonction PEP n'est qu'un brouillon, et que la terminologie pourrait n'être que l'idée d'une seule personne. Mais ce sont de bonnes conditions de toute façon. :)

Ainsi, les arguments * Et ** Décompressent simplement leurs structures de données respectives:

args = (1, 2, 3)  # usually a Tuple, always an iterable[1]

f(*args) → f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1]: Les itérables sont des objets qui implémentent la méthode __iter__() et les mappages sont des objets qui implémentent keys() et __getitem__(). Tout objet qui prend en charge ce protocole sera compris par les constructeurs Tuple() et dict(), afin qu'ils puissent être utilisés pour décompresser des arguments.

86
Stefano Palazzo

Je ne pense pas qu'il ait un nom. Dans le Python Docs sous "Déballage des listes d'arguments", il est simplement appelé "l'opérateur ** -".

Je ne sais pas ce que vous entendez par "l'autre" structure de données. Lorsque vous effectuez f(**kwargs) vous décompressez le dictionnaire kwargs comme une séquence de paires clé-valeur. Je ne vois pas qu'il y ait une autre structure impliquée.

Je vais copier exemple dans la documentation ci-dessus pour plus de clarté.

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

Voir aussi: Que signifient * args et ** kwargs?

13
Kris Harper

Si vous ne savez pas comment appeler un opérateur particulier ou s'il n'a pas de nom, vous pouvez toujours recourir à Waka Waka Bang Splat comme référence pour vous aider à comprendre comment l'appeler. Dans ce cas, pour ** Je l'appellerais double-splat, bien qu'il existe quelques noms alternatifs pour les symboles .

3
aculich