90 votes

Que font * (étoile simple) et / (barre oblique) en tant que paramètres indépendants ?

Dans la définition de fonction suivante, que font les * et / compte ?

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

NOTE : Ne pas confondre avec les astérisques simples ou doubles dans *args | **kwargs ( résolu ici )

117voto

Abdul Niyas P M Points 2031

Il existe un nouvelle syntaxe des paramètres de fonction / pour indiquer que certains paramètres de fonction doivent être spécifiés en position et ne peuvent pas être utilisés comme arguments de mot-clé.[ Il s'agit d'une nouveauté dans Python 3.8 ]

La documentation précise certains des cas d'utilisation/avantages de Paramètres positionnels uniquement

  1. Il permet aux fonctions Python pures d'émuler complètement les comportements de fonctions codées en C existantes. Par exemple, la fonction intégrée pow() n'accepte pas d'arguments de type mot-clé :

    def pow(x, y, z=None, /):
        "Emulate the built in pow() function"
        r = x ** y
        return r if z is None else r%z
  2. Un autre cas d'utilisation consiste à exclure les arguments de type mot-clé lorsque le paramètre n'est pas utile. Par exemple, l'option intégrée len() La fonction a la signature len(obj, /) . Cela permet d'éviter les appels gênants tels que :

    len(obj='hello')  # The "obj" keyword argument impairs readability
  3. Un autre avantage du marquage d'un paramètre comme étant uniquement positionnel est que permet de modifier le nom du paramètre à l'avenir sans risque pour la santé. risque de casser le code client. Par exemple, dans le module de statistiques, le nom du paramètre dist peut être modifié à l'avenir. Cela a été rendu Cela a été rendu possible grâce à la spécification de fonction suivante :

    def quantiles(dist, /, *, n=4, method='exclusive')
        ...

Où comme * est utilisé pour forcer le à l'appelant d'utiliser des arguments nommés . Il s'agit de l'un des cas d'utilisation des arguments nommés.

Ainsi, compte tenu de la méthode,

def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

Il doit être appelé avec

obj.func(10, 20, 30, param4=50, param5=60)

ou

obj.func(10, 20, param3=30, param4=50, param5=60)

ie,

  1. param1 , param2 doit être spécifié en position .
  2. param3 peut être appelé soit avec positionnel ou mot-clé .
  3. param4 et param5 doit être appelé avec mot-clé argument.

DEMO :

>>> class MyClass(object):
...     def func(self, param1, param2, /, param3, *, param4, param5):
...         return param1, param2, param3, param4, param5
...
>>> obj = MyClass()
>>>
>>> assert obj.func(10, 20, 30, param4=40, param5=50), obj.func(
...     10, 20, param3=30, param4=40, param5=50
... )

6voto

U9-Forward Points 8640

Comme indiqué dans le documents , la barre oblique est pour les arguments positionnels uniquement, comme le dit la documentation :

Il existe une nouvelle syntaxe de paramètre de fonction / pour indiquer que certains paramètres de fonctions doivent être spécifiés en position et ne peuvent pas être utilisés comme arguments de mots-clés. Il s'agit de la même notation que celle utilisée par help() pour les fonctions C annotées par Larry Hastings Clinique de l'argumentation l'outil.

Quant à l'astérisque, elle est mentionnée ici dans la documents :

Pour un paramètre ayant une valeur par défaut, l'argument correspondant peut être omis dans un appel, auquel cas la valeur par défaut du paramètre est substituée. Si un paramètre a une valeur par défaut, tous les paramètres suivants jusqu'à l'argument " * "doit également avoir une valeur par défaut - il s'agit d'une restriction syntaxique qui n'est pas exprimée par la grammaire.


def func(self, param1, param2, /, param3, *, param4, param5):
     print(param1, param2, param3, param4, param5)

Les façons de l'appeler seraient donc les suivantes :

obj.func(10, 20, 30, param4=50, param5=60)

Et.. :

obj.func(10, 20, param3=30, param4=50, param5=60)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X