Python 3.8 : arguments exclusivement positionnels
Python 3.8 a ajouté un nouveau paramètre syntaxique pour les fonctions, le slash /, qui permet d’indiquer que certains paramètres de fonctions ne peuvent être spécifiés que de manière positionnelle, c’est à dire que les arguments ne pourront plus être affectés par leur nom.
Je pense que ce paramètre restera peu déclaré, néanmoins, il peut avoir une vrai utilité. Comment s’en servir et quoi ça sert ? Quelques explications dans ce billet.
Rappel sur les fonctions
En Python, une fonction se déclare de la manière suivante.
def create_account(id, value, is_vip): print(id, value, is_vip)
Je vais commencer par un peu de vocabulaire en faisant une précision sur les termes d’arguments et de paramètres. C’est un simple rappel de la FAQ :
- un paramètre est le nom d’une entité attendue par une fonction
- un argument est la valeur effective passée à un paramètre d’une fonction.
Cette fonction peut maintenant être appelée en passant les arguments de manière positionnelle ou de manière nommée.
create_account("id", 500, False) create_account("id", value=500, is_vip=False)
Il est possible d’appeler la fonction en déclarant tous les arguments par leur nom. Et plus drôle, en ne respectant plus du tout leur position. « Drôle » est évidemment ironique, ne pas respecter l’ordre est une source de confusion à la lecture.
create_account(id="id", value=500, is_vip=False) create_account(value=500, id="id", is_vip=False)
Imposer un paramètre positionnel
Cette même fonction déclarée avec le code ci-dessous impose que le paramètre id soit uniquement positionnel. Il n’est plus possible de lui affecter un argument par son nom.
def create_account(id, /, value, is_vip): print(id, value, is_vip)
Ainsi, les appels suivants sont valides
create_account("id", 500, False) create_account("id", value=500, is_vip=False) create_account("id", is_vip=False, value=500)
Mais pas le suivant qui lèvera une TypeError. car le paramètre id ne peut recevoir des keyword arguments.
create_account(id="id", value=500, is_vip=False)
À quoi ça sert ?
La question est évidemment pourquoi avoir ajouté ce comportement. Il y a plusieurs raisons
La première est de transposer des comportements de fonctions équivalents du C. On rappellera que Python repose sur un interpréteur écrit en C et que même si Python est ouvert à un large public souvent sans bases de programmation, la cohabitation avec le C est très importante. Mais nul doute que cette justification n’intéressera pas le plus grand nombre.
Ce qui est plus intéressant, c’est d’empêcher l’attribution par nom du paramètre. Ainsi, il sera possible de changer librement le nom du paramètre au besoin. Prenons le cas de notre fonction, la paramètre id pose problème car il existe une fonction id() en Python. Le paramètre masque donc cette fonction dans le corps de la fonction mais ce n’est pas grave car nous n’avons pas besoin de la fonction id() dans le corps de cette fonction.
Jusqu’au jour où si, nous en avons besoin. Il faudra alors renommer ce paramètre. En empêchant l’attribution par mot-clef, nous conservons cette liberté en sachant que cela n’aura aucun impact sur le code utilisant cette fonction.
Une autre conséquence est que cette syntaxe offre la possibilité d’évoluer la fonction vers un usage de **kwargs comme dans l’exemple suivant.
def create_account(id, /, **kwargs): print(id, kwargs)
Pour une présentation plus visuelle
J’ai présenté les arguments strictement positionnels lors d’un meetup à distance sur les nouveautés Python 3.8 que vous pouvez retrouver dans la vidéo suivante.
En conclusion
Disons le franchement, cette nouveauté de Python 3.8 n’a pas beaucoup d’intérêt pour la plupart des développements. Elle est surtout destinée à ceux qui écrivent des bibliothèques et qui doivent garder une certaine liberté d’évolution. Pour les autres, il est avant tout important de la connaitre pour comprendre la signification du slash dans les paramètres des fonctions. Et puis, c’est toujours important de connaitre ces subtilités.
Si vous avez aimé ce post, n’hésitez pas à laisser un commentaire ci-dessous ou sur la page Facebook 😉
À propos de... Darko Stankovski
iT guy, photographe et papa 3.0, je vous fais partager mon expérience et découvertes dans ces domaines. Vous pouvez me suivre sur les liens ci-dessous.