Der Ausdruck "Schlüsselwort nur Argumente" in Python ist ein bisschen mehrdeutig - normalerweise nehme ich an, dass es Argumente enthält, die an einen **kwarg
-Parameter übergeben werden. Das Modul inspect
scheint jedoch zwischen **kwarg
und etwas, das nur "Schlüsselwort-Argumente" genannt wird, zu unterscheiden.
Von den Dokumenten :
inspect.getfullargspec (func)
Ermittelt die Namen und Standardwerte der Argumente einer Python-Funktion. EIN Named Tupel wird zurückgegeben:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)
args
ist eine Liste der Argumentnamen.varargs
undvarkw
sind die Namen der*
und**
Argumente oderNone
. defaults ist ein n-tupel des Standardwerte der letzten n Argumente oder Keine, wenn keine vorhanden sind Standardargumente.kwonlyargs
ist eine Liste von Argumenten nur für Schlüsselwörter Namen.kwonlydefaults
ist ein Dictionary, das Namen vonkwonlyargs
auf zuordnet Standardeinstellungen.annotations
ist ein Wörterbuch, dem Argumentnamen zugeordnet sind Anmerkungen.
Also hat das inspect-Modul etwas namens kwonlyargs
und kwonlydefaults
. Was bedeutet das in einer tatsächlichen Funktionssignatur? Wenn Sie eine Funktionssignatur haben, die ein **kwarg
-Argument akzeptiert, können Sie die Namen der Schlüsselwortargumente erst zur Laufzeit kennen, da der Aufrufer praktisch jedes beliebige Wörterbuch übergeben kann. Also, welche Bedeutung hat kwonlyargs
im Kontext einer Funktionssignatur - was inspect.getfullargspec
bietet.
TL; DR : Nur-Schlüsselwort-Argumente sind nicht identisch mit normalen Schlüsselwortargumenten.
Nur-Schlüssel-Argumente sind Argumente, die nach *args
und vor **kwargs
in einem Funktionsaufruf stehen. Betrachten Sie als Beispiel diesen generischen Funktionskopf:
Oben verwendet kwonly
ein Argument nur für Schlüsselworte. Dies bedeutet, dass Sie seinen Namen angeben müssen, wenn Sie einen Wert angeben. Mit anderen Worten, Sie müssen explizit schreiben:
statt nur einen Wert zu übergeben:
%Vor%Um dies besser zu erklären, betrachten Sie diesen Beispielaufruf der oben angegebenen Funktion:
%Vor%Wenn Python diesen Aufruf interpretiert, wird es:
Weisen Sie arg
zu 1
zu, da seine Position in der Funktionssignatur mit der Position von 1
im Aufruf übereinstimmt.
Platzieren Sie 2
in *args
, da *args
zusätzliche Positionsargumente und 2
extra enthält.
Weisen Sie kwonly
zu 3
zu, weil wir es (wie es nötig ist) explizit dazu erklärt haben. Beachten Sie, dass wenn wir dies stattdessen getan hätten:
3
würde auch in *args
platziert werden und ein TypeError
würde ausgelöst werden, um kein Argument für kwonly
zu liefern (da wir in diesem Fall keinen Standardwert angegeben haben).
Platzieren Sie kw=4
in **kwargs
, da es sich um ein zusätzliches Keyword-Argument handelt, das von **kwargs
gesammelt wird.
Unten ist eine Demonstration dessen, was ich oben gesagt habe:
%Vor%Grundsätzlich können Sie nur Schlüsselwort-Argumente als Schlüsselwortargumente betrachten, bei denen Sie den Namen des Parameters angeben müssen, wenn Sie ihnen einen Wert zuweisen. Ein positionaler Wert ist nicht ausreichend, wie bei normalen Schlüsselwortargumenten.
%Vor%Schließlich weiß ich, dass einige Leute denken: "Warum haben Sie nur Argumente mit Keyword?" Die Antwort ist einfach, dass sie die Dinge in einigen Fällen besser lesbar machen (besonders bei Funktionen, die eine variable Anzahl von Argumenten haben).
Betrachten Sie als Beispiel die integrierte Funktion max
und ihr Schlüsselwort key
. Was ist für dich besser lesbar? So etwas zu tun:
und Leute erinnern sich , dass das erste Argument für max
immer das Tastenfunktion oder tu dies:
und machen Sie jedem klar, dass lambda x: -x
Ihre Schlüsselfunktion ist. Wenn Sie key
zu einem Keyword-Argument machen, können Sie die Schlüsselfunktion einfach weglassen, wenn Sie keine benötigen:
anstatt zu tun:
%Vor%Weitere Informationen finden Sie in folgenden Quellen:
Tags und Links python arguments function python-3.x signature