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
-
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
-
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
-
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,
-
param1
, param2
doit être spécifié en position .
-
param3
peut être appelé soit avec positionnel ou mot-clé .
-
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
... )