2016-07-19 24 views
4

Wenn Sie die Signatur von Python eingebauten in sorted() Funktion wie folgt prüfen:Warum sortiert() 's Schlüsselparameter erfordern ein Schlüsselwort-Argument

import inspect 
print(inspect.signature(sorted)) 

Die Signatur ist: (iterable, key=None, reverse=False).

Basierend auf meinem Verständnis von Positions- und optionalen Argumenten here erworben, würde es scheinen, wie Sie ein iterable Argument liefern könnten und dann ein key Argument ohne ein Schlüsselwort key= für das key Argument zu benötigen. Sie müssen jedoch immer key= angeben, wenn Sie ein key Argument übergeben. Warum das?

Ich verstehe, dass, wenn man wollte reverse=True angeben, aber ohne key Argument, würden Sie ein Schlüsselwort dafür brauchen, aber ich verstehe nicht, warum Sie key= angeben müssen würde, wenn Sie eine key Bereitstellung .

Antwort

2

Dies ist Python issue 26729, ein Fehler in sorted.__text_signature__, die die / und * erforderlich fehlt, um anzuzeigen, dass iterable Positionsgeschützt ist und key und reverse sind Keyword-only. Der Patch befindet sich im Patch-Review, vergeben an Raymond Hettinger. Sobald die gepatchte Version freigegeben wird, sollte die Signatur als

(iterable, /, *, key=None, reverse=False) 
+0

Dank anzuzeigen, dass Thread viele meiner Verwirrung anspricht. –

+0

Eigentlich bin ich jetzt eher verwirrt. Warum funktioniert die Funktion nicht so, wie die aktuelle Signatur sagt? Was bringt es, die Funktion nur mit Argumenten mit Schlüsselwörtern arbeiten zu lassen? –

+0

@ user123123123: 'sorted' und' list.sort' verwendet, um ein 'cmp'-Argument zu nehmen. Wenn das entfernt wurde, half das 'key'- und' reverse'-Schlüsselwort - nur der Übergang, indem es klarere Fehler für Code gab, der immer noch versucht, 'cmp' zu verwenden. Außerdem erleichtert es zukünftige Änderungen an der Schnittstelle und Sie müssen sich nicht daran erinnern, in welcher Reihenfolge die Argumente eingehen. – user2357112