2017-09-01 3 views

Antwort

0

Sie werden unterschiedliche Meinungen bekommen. Persönlich würde ich argumentieren, dass die Verwendung von Schlüsselwort Argumenten wann immer möglich ist streng besser, weil es Menschen lesbare Semantik an einen Funktionsaufruf anhängt. Der Leser hat eine gute Chance, zu erraten, was die Argumente sein sollen, ohne den Code/die Dokumente weiter zu überprüfen.

Allerdings unterlasse ich manchmal das Schlüsselwort (s), wenn Sie bekannte Funktionen verwenden.

1

Der Hauptvorteil, den ich bei der Verwendung expliziter Namen sehe, ist, dass die Änderung der Signatur einer Funktion weniger Einfluss auf den darauf basierenden Code hat.

Zum Beispiel, sagen Sie eines Moduls Funktion verwenden, wie folgt definiert:

their_function(a, b, c=1) 

Sie es mit dem c Stichwort Argument durch den Aufruf:

their_function(myA, myB, myC) 

Aber jetzt, die Modul Entwickler finden es nützlich, ein anderes Schlüsselwortargument zu haben, und in ihren Köpfen macht es mehr Sinn, dass es vor c kommt. So, jetzt , die Funktion ist:

their_function(a, b, d=2, c=1) 

überall their_function(myA, myB, myC) nennen, jetzt myC wird weitergegeben their_function als d, und alles ist durcheinander.

Auf der anderen Seite hatte man es von their_function(myA, myB, c=myC) genannt, wäre die Zuordnung der Keyword-Argumente gewesen, so dass myC noch their_function als c bestanden hätte.

Natürlich ist dies wahrscheinlich Overkill für offensichtliche Funktionen wie print oder open, deren Positionargument natürlich ist. Aber ich finde es wirklich beruhigend zu rufen open(path, 'r', encoding='utf8'), anstatt open(path, 'r', 'utf8'), denn auch wenn ich die Bestellung falsch bekam, wäre das Verhalten immer noch wie erwartet.


Was mich betrifft, außer in einigen wenigen Fällen, in denen es kontraintuitiv sein würde, neige ich dazu, die Verwendung der Namen für die Keyword-Argumente zu erzwingen.

Python 3, von einer Version auf, können Sie folgendes tun:

def my_function(a, b, *, c=1): 
    pass 

Hier wird die Verwendung des Splat-Operators * allein sagt Python, dass kein Positions Argument kann nach dem dritten finden. Dies führt zu einem TypeError, wenn ein viertes Argument als positionelles übergeben wird, dh ohne es zu benennen.

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

Dies hilft Ihnen, Ihren Code ein wenig mehr narrensicher, vor allem, wenn Funktionen mit vielen Positions oder Keyword-Argumente zu definieren.

Verwandte Themen