Python-Inspektionsmodul: Nur Schlüsselwort-Argumenten

8

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 und varkw sind die Namen   der * und ** Argumente oder None . 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 von kwonlyargs 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.

    
Siler 16.11.2014, 23:27
quelle

1 Antwort

9

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:

%Vor%

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:

%Vor%

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:

    %Vor%

    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:

%Vor%

und Leute erinnern sich , dass das erste Argument für max immer das Tastenfunktion oder tu dies:

%Vor%

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:

%Vor%

anstatt zu tun:

%Vor%

Weitere Informationen finden Sie in folgenden Quellen:

iCodez 17.11.2014, 00:31
quelle