70

Pythonでは、次のように関数を定義できます。

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

この場合、私は次のように呼び出すことができますfunc

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

関数を次のように定義することもできます。

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

これは次のように呼ぶことができます

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

最後に、2つの形式を組み合わせることができます

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

しかし、機能しないのは次のことです。

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

私の当初の考えは、これはおそらく関数のためだと思っていました

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

と呼ぶことができます

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

argsしたがって、これにより、3をパックするか、にパックするかについて、あいまいさが生じkwargsます。ただし、Python 3では、キーワードのみの引数を指定する機能があります。

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

これにより、次の構文のあいまいさはないようです。

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

ただし、これでも構文エラーが発生します(Python3.2でテスト済み)。私が行方不明になっている理由はありますか?そして、上記で説明した動作を取得する方法はありますか(デフォルトの引数を使用)-関数内の辞書を*args操作することで、その動作をシミュレートできることを知っています。kwargs

4

4 に答える 4

71

Python 3 でそれを行うことができます。

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

裸は、 で可変数の位置引数を受け入れ*に、キーワードのみの引数を指定する場合にのみ使用されます。2 つの s は使用しません。*args*

文法から引用すると、Python 2では、

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

Python 3では、あなたは持っています

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

これには、パラメーターの後に追加のパラメーターの規定が含まれてい*ます。

アップデート:

最新の Python 3 ドキュメントはこちら

于 2012-03-26T13:44:14.980 に答える
4

明確かつ簡潔:

Python 3.5以降の場合:

def foo(a, b=3, *args, **kwargs):
  defaultKwargs = { 'c': 10, 'd': 12 }
  kwargs = { **defaultKwargs, **kwargs }
  
  print(a, b, args, kwargs)
  
  # Do something else

foo(1) # 1 3 () {'c': 10, 'd': 12}
foo(1, d=5) # 1 3 () {'c': 10, 'd': 5}
foo(1, 2, 4, d=5) # 1 2 (4,) {'c': 10, 'd': 5}

注: Python 2で使用できます

kwargs = merge_two_dicts(defaultKwargs, kwargs)

Python 3.5では

kwargs = { **defaultKwargs, **kwargs }

Python 3.9では

kwargs = defaultKwargs | kwargs  # NOTE: 3.9+ ONLY
于 2020-11-25T11:16:08.363 に答える