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




1 Answers

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 * .

pass keyword

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.




Related

python syntax python-3.x