variable - Aufrufen einer Python-Funktion mit*args,** kwargs und optionalen/default-Argumenten




python variable length function arguments (2)

Sie können das auf Python 3 tun.

def func(a,b,*args,kw1=None,**kwargs):

Das bloße * wird nur verwendet, wenn Sie Argumente nur für Schlüsselwörter angeben möchten, ohne eine variable Anzahl von Positionsargumenten mit *args Argumenten zu akzeptieren. Du verwendest keine zwei * s.

Um von der Grammatik zu zitieren, haben Sie in Python 2

parameter_list ::=  (defparameter ",")*
                    (  "*" identifier [, "**" identifier]
                    | "**" identifier
                    | defparameter [","] )

während du auf Python 3 bist

parameter_list ::=  (defparameter ",")*
                    (  "*" [parameter] ("," defparameter)*
                    [, "**" parameter]
                    | "**" parameter
                    | defparameter [","] )

Dies beinhaltet eine Bestimmung für zusätzliche Parameter nach dem Parameter * .

https://code.i-harness.com

In Python kann ich eine Funktion wie folgt definieren:

def func(kw1=None,kw2=None,**kwargs):
   ...

In diesem Fall kann ich func wie folgt aufrufen:

func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)

Ich kann auch eine Funktion definieren als:

def func(arg1,arg2,*args):
    ...

das kann als aufgerufen werden

func(3,4,additional,arguments,go,here,Ellipsis)

Schließlich kann ich die beiden Formen kombinieren

def func(arg1,arg2,*args,**kwargs):
    ...

Aber, was nicht funktioniert, ruft an:

func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs):  #SYNTAX ERROR (in python 2 only,  apparently this works in python 3)
    ...

Mein ursprünglicher Gedanke war, dass das wahrscheinlich an einer Funktion lag

def func(arg1,arg2,*args,kw1=None):
    ...

kann als aufgerufen werden

func(1,2,3) #kw1 will be assigned 3

Dies würde zu einer gewissen Zweideutigkeit führen, ob 3 in Args oder Kwargs gepackt werden sollte. Mit Python 3 gibt es jedoch die Möglichkeit, Argumente nur für Schlüsselworte anzugeben:

def func(a,b,*,kw=None):  #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
   ...

Damit scheint es keine syntaktische Ambiguität zu geben mit:

def func(a,b,*args,*,kw1=None,**kwargs):
    ...

Dies führt jedoch immer noch zu einem Syntaxfehler (getestet mit Python3.2). Gibt es einen Grund dafür, dass ich vermisse? Und, gibt es eine Möglichkeit, das oben beschriebene Verhalten zu erhalten (* Argumente mit Standardargumenten zu haben) - Ich weiß, dass ich dieses Verhalten simulieren kann, indem ich das Kwargs-Wörterbuch innerhalb der Funktion manipuliere.


Wenn Sie eine Mischung aus beiden machen möchten, denken Sie daran, dass * args und ** kwargs die letzten angegebenen Parameter sein müssen.

def func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #Invalid
def func(arg1,arg2,kw1=None,kw2=None,*args,**kwargs): #Valid

Die Kommentare scheinen darauf zu beruhen, zu vermischen, wie eine Funktionsdefinition konstruiert wird, im Vergleich dazu, wie die bereitgestellten Argumente den in der Definition angegebenen Parametern zugeordnet werden.

Dies ist die Definition dieser Funktion, die 6 Parameter hat. Es wird aufgerufen, indem ihm in einem Funktionsaufruf benannte und unbenannte Argumente übergeben werden.

Für dieses Beispiel ... Wenn ein Argument beim Aufrufen der Funktion benannt wird, kann es außerhalb der Reihenfolge bereitgestellt werden. arg1 und arg2 sind obligatorische Parameter, und wenn sie nicht als benannte Argumente an die Funktion übergeben werden, müssen sie in der Reihenfolge der bereitgestellten unbenannten Argumente zugewiesen werden. kw1 und kw2 haben Standardwerte, die in der Funktionsdefinition angegeben sind, so dass sie nicht obligatorisch sind. Wenn sie jedoch nicht als benannte Argumente bereitgestellt werden, nehmen sie alle verfügbaren Werte aus den verbleibenden bereitgestellten unbenannten Argumenten. Alle unbenannten Argumente, die noch übrig sind, werden der Funktion in einem Array namens args zur Verfügung gestellt. Alle benannten Argumente, die in der Funktionsdefinition keinen entsprechenden Parameternamen haben, werden dem Funktionsaufruf in einem Wörterbuch mit dem Namen kwargs zur Verfügung gestellt.





python-3.x