2017-09-01 4 views

Répondre

0

Vous obtiendrez des opinions différentes. Personnellement, je soutiendrais que l'utilisation des arguments de mot clé chaque fois que possible est strictement mieux car il attache une sémantique lisible par l'homme à un appel de fonction. Le lecteur a une chance décente de deviner ce que les arguments sont censés être sans inspecter le code/docs plus loin. Cependant, il m'arrive d'omettre le (s) mot (s) -clé (s) lorsque j'utilise des fonctions bien connues.

1

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é.