Python-Positionsargumente und Schlüsselwortargumente

8

Ich lese die Quellcodes von mercurial und fand ein solches func def in commands.py:

%Vor%

In Python müssen postionale Argumente vor Schlüsselwortargs gestellt werden. Aber hier ist patch1 ein Schlüsselwort-Argument, gefolgt von einem Positionsargument *patches . Warum ist das in Ordnung?

    
guoqiao 13.12.2011, 08:13
quelle

4 Antworten

8

Schau einfach in die PEP 3102 und es scheint, dass sie irgendwie mit dies .

Zusammenfassend lassen sich Patches und Opts verwenden, um variable Argumente zu akzeptieren, aber das letztere ist es, Schlüsselwortargumente zu akzeptieren. Die Schlüsselwortargumente werden als Wörterbuch übergeben, wobei die variablen Positionsargumente als Tupel .

Aus Ihrem Beispiel

%Vor%

Alle Positionsparameter nach u1,repo and patch1 würden als Tupel in Patches eingeschlossen. Alle Schlüsselwortargumente, die den variablen Positionsargumenten folgen, werden als Dictionary-Objekte durch Optionen eingeschlossen.

Eine weitere wichtige Sache ist, dass es Aufgabe des Aufrufers ist, sicherzustellen, dass die Bedingung non-keyword arg after keyword arg nicht verletzt wird.

Also etwas, das dies verletzt, würde einen Syntaxfehler verursachen.

Zum Beispiel

Anrufe wie

%Vor%

sind gültig, aber

%Vor%

würde einen Syntaxfehler verursachen SyntaxError: non-keyword arg after keyword arg

Im ersten gültigen Fall import_(1,2,3,test="test")

%Vor%

Im zweiten gültigen Fall import_(1,2,3,patch1=4,test="test")

%Vor%

Im dritten gültigen Fall import_(1,2,3,4,5)

%Vor%

Im vierten gültigen Fall import_(1,2,patch1=3,test="test")

%Vor%     
Abhijit 13.12.2011, 08:23
quelle
3

Wahrscheinlich verwechseln Sie die Funktionsdefinition und die Funktionsaufrufsyntax etwas.

patch1 ist kein Schlüsselwort arg, es ist ein Positionsarg mit einem voreingestellten Argumentwert.

*patches ist eine Argumentliste und kein Positionsargument.

Bitte sehen Sie sich diesen Abschnitt in den offiziellen Anleitungen an:

Lassen Sie mich nun die Hauptpunkte zusammenfassen, die diese Funktion als Beispiel verwenden:

%Vor%

Funktionsdefinition

Sie haben eine Reihe von Argumenten, die explizit durch den Namen definiert werden ( a1 , a2 und a3 ), wobei a3 standardmäßig von None initialisiert wird, wenn sie während des Aufrufs nicht angegeben wird. Die Argumente a1 und a2 müssen in jedem gültigen Aufruf dieser Funktion angegeben werden.

Die Funktion kann mit zusätzlichen Argumenten aufgerufen werden, die im Verzeichnis kwargs (nach Schlüsselwort) oder in der Liste args (wenn nicht durch Schlüsselwort geliefert) erscheinen. Wenn args und kwargs in der Funktionsdefinition nicht vorhanden wären, könnte der Aufrufer keine weiteren Argumente hinzufügen, außer denen, die explizit in der Funktionsdefinition für den Funktionsaufruf benannt wurden.

In der Funktionsdefinition müssen Sie zuerst die expliziten Argumente ohne Standardinitialisierer, dann die expliziten Argumente mit Standardinitialisierer, drittens die Argumentliste und zuletzt das Schlüsselwortargumentwörterbuch angeben.

Funktionsaufruf

Es gibt verschiedene Möglichkeiten, die Funktion aufzurufen. Zum Beispiel führen die folgenden Aufrufe zu gleichen Ergebnissen:

%Vor%

Das heißt, die Funktionsargumente werden entweder durch ihre Position (Positions- oder Nicht-Schlüsselwortargumente) oder durch ihren angegebenen Namen (Schlüsselwortargumente) aufgelöst.

Wenn Sie die Funktion aufrufen, müssen Sie zuerst die Nicht-Schlüsselwort-Argumente und zuletzt die Schlüsselwort-Argumente eingeben, z. B.

%Vor%

Nun werden Positionsargumente, die nicht in die Liste der angegebenen Argumente in der Funktionsdefinition passen, an die Argumentliste *args angehängt, und Schlüsselwortargumente, die nicht in die Liste der angegebenen Argumente in der Funktion passen Die Definition wird in das Schlüsselwort-Argumentwörterbuch **kwargs eingefügt.

    
moooeeeep 13.12.2011 08:23
quelle
2

Das Übergeben des Schlüssels an ein Schlüsselwort-Argument kann optional sein, wenn die Position eindeutig ist. Beobachte:

%Vor%

Wie Sie sehen, macht das Weglassen des Schlüssels von patch1 dieses Argument zu einem Nicht-Schlüsselwort, wodurch die SyntaxError -Ausnahme nicht ausgelöst wird.

BEARBEITEN: moooeeeep in seiner Antwort sagt das

  

"Patch1 ist kein Schlüsselwort arg, es ist ein Positionsarg mit einem voreingestellten Argumentwert."

Das ist nicht falsch, aber die folgende IMO veranschaulicht, warum eine solche Definition nicht eindeutig ist:

%Vor%

HTH!

    
mac 13.12.2011 08:22
quelle
2

Ich glaube, wenn eine Funktion aufruft mit:

%Vor%

Dies würde ein "Schlüsselwort" -Argument verwenden, aber wenn die Schnittstelle einer Funktion mit definiert:

%Vor%

Sie definieren einen "Standardwert". ()

Also, um deine Frage zu beantworten; Einen Standardwert nach einem Positionsargument zu haben, ist völlig normal und bedeutet, dass vor einem Schlüsselwort eine Funktion mit einem Nicht-Schlüsselwort-Argument aufgerufen wird.

Wenn Sie eine Funktion aufrufen, können Sie nach einem Schlüsselwort kein Nicht-Schlüsselwort-Argument haben.

    
potato 13.12.2011 08:26
quelle

Tags und Links