Le principal avantage que je vois dans l'utilisation de noms explicites est que la modification de la signature d'une fonction aura moins d'impact sur le code qui s'y appuie.
Par exemple, supposons que vous utilisez la fonction d'un module, défini comme:
their_function(a, b, c=1)
Vous appelez avec l'argument mot-clé c
par:
their_function(myA, myB, myC)
Mais maintenant, le module de les développeurs trouvent utile d'avoir un autre argument mot-clé, et dans leur esprit, il est plus logique que cela vienne avant c
. Alors maintenant, la fonction est:
their_function(a, b, d=2, c=1)
Partout où vous appelez their_function(myA, myB, myC)
, maintenant myC
est passé à their_function
comme d
, et tout est foiré.
D'autre part, vous aviez appelé par their_function(myA, myB, c=myC)
, la mise en correspondance des arguments de mots clés aurait été de sorte que myC
aurait encore été passé à their_function
comme c
.
Bien sûr, cela est probablement exagéré pour des fonctions évidentes, telles que print
ou open
dont l'argument positionnel est naturel. Mais je trouve vraiment rassurant d'appeler open(path, 'r', encoding='utf8')
, plutôt que open(path, 'r', 'utf8')
, car même si j'ai mal commandé, le comportement serait toujours comme prévu.
Quant à moi, sauf dans quelques cas où il serait contre-intuitif, je tendance à forcer l'utilisation des noms pour les arguments de mot-clé.
Python 3, d'une certaine version, vous permet d'effectuer les opérations suivantes:
def my_function(a, b, *, c=1):
pass
Ici, l'utilisation de l'opérateur Splat *
seul dit Python qu'aucun argument de position se trouve après la troisième. Cela se traduira par un TypeError
lors du passage d'un quatrième argument en positionnel, c'est-à-dire sans le nommer.
>>> my_function(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_function() missing 1 required positional argument: 'b'
>>> my_function(1, 2)
# OK
>>> my_function(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: my_function() takes 2 positional arguments but 3 were given
>>> my_function(1, 2, c=3)
# OK
Cela vous permet de rendre votre code un peu plus-preuve fou, surtout lors de la définition des fonctions avec de nombreux arguments de position ou mot-clé.