1. ホーム
  2. python

[解決済み] args と **kwargs を使ったデフォルトの引数。

2023-02-27 12:17:37

質問

質問 Python 2.x (私は 2.7 を使っています) でデフォルトの引数を使うにはどちらが適切でしょうか? *args**kwargs ?

このトピックに関連する質問をSOで見つけたのですが、それは Python 3 :

args,**kwargsとオプション/デフォルト引数でPython関数を呼び出す

そこでは、この方法が有効だそうです。

def func(arg1, arg2, *args, opt_arg='def_val', **kwargs):
    #...

2.7では、結果的に SyntaxError . このような関数を定義するために推奨される方法はありますか?

私はこの方法でそれを動作させたが、私はより良いソリューションがあると思います。

def func(arg1, arg2, *args, **kwargs):
    opt_arg ='def_val'
    if kwargs.__contains__('opt_arg'):
        opt_arg = kwargs['opt_arg']
    #...

どのように解決するのですか?

の前にデフォルトの引数を置くだけです。 *args :

def foo(a, b=3, *args, **kwargs):

今すぐ b はキーワード引数か第2位置引数で渡すと、明示的に設定されます。

例を挙げます。

foo(x) # a=x, b=3, args=(), kwargs={}
foo(x, y) # a=x, b=y, args=(), kwargs={}
foo(x, b=y) # a=x, b=y, args=(), kwargs={}
foo(x, y, z, k) # a=x, b=y, args=(z, k), kwargs={}
foo(x, c=y, d=k) # a=x, b=3, args=(), kwargs={'c': y, 'd': k}
foo(x, c=y, b=z, d=k) # a=x, b=z, args=(), kwargs={'c': y, 'd': k}

特に注意してほしいのは foo(x, y, b=z) が機能しないのは b は位置によって割り当てられるからです。


このコードはPython 3でも動きます。デフォルトのアーギュメントである の後に *args は、Python 3 ではキーワードのみの引数として扱われ、以下のことが可能です。 だけです。 を位置ではなく名前で指定できるようになりました。Python 2 でキーワードのみの引数を指定したい場合は、@mgilson の 解決策 .