3

私はこのようなことをする必要があります:

def func1(a, *args, b="BBB", **kwargs):
    print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs)

したがって、このように呼び出す:

func1("AAAA", h="HHH", j="JJJ")

出力を生成します:

a=AAAA b=BBB args=() kwargs={'h': 'HHH', 'j': 'JJJ'}

ただし、デフォルトの名前付き引数をの後に置くことはできません*args。(SyntaxError: invalid syntax

  • なぜこれが許可されないのですか?
  • これを実装するための読みやすい方法はありますか?私が知っている唯一の方法はですb=kwargs.pop("b", "BBB")が、これはあまり読みやすくありません。これは、それが属する関数呼び出し定義に含めることをお勧めします。これは、デフォルト値またはユーザー指定の値のいずれかの値を常に持つパラメーターです。

編集

私はb前に置くことができargsます:

def func1(a, b="BBB", *args, **kwargs):
    print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, kwargs)

しかし、それはこの呼び出しを意味します:

func1("AAAA", "CCC", h="HHH", j="JJJ")

に割り当てます"CCC"b、これは必要ありません。b位置引数ではなく、名前付き引数になりたいです。

4

3 に答える 3

2

これは Python 3 ( demo )では完全に有効です。PEP 3102では、キーワードのみの引数が導入されました。

kwargs.popPython 2.x では、 、または適切なデコレータを引き続き使用する必要があります。

于 2013-03-21T11:12:22.243 に答える
1

Python 2では、

現在の Python 関数呼び出しパラダイムでは、引数を位置またはキーワードで指定できます。引数は、名前で明示的に入力することも、位置で暗黙的に入力することもできます。

結果として、def func1(a, *args, b="BBB", **kwargs)あいまいになるため、許可されません: 呼び出しfunc1(1, 2)では、 should args == ()and b == 2、またはargs = (2,)and b == "BBB"?

一方、 is が受け入れられるのはこのためです(def func1(a, b="BBB", *args, **kwargs)それはあなたが望むことをしませんが):bは常に 2 番目の引数として渡されます。func1(1, c=3, b=2)func1(1, 2, c=3)

ecatmur が指摘したように、Python 3 では引数の処理方法が変更され、必要な柔軟性がもたらされました。

于 2013-03-21T11:22:38.100 に答える
0
def func1(a, *args, **kwargs):
    b, k = (lambda b="BBBB", **k: b, k)(**kwargs)
    print "a=%s b=%s args=%s kwargs=%s" % (a, b, args, k)

代替案になる可能性があります。

于 2013-03-21T11:14:19.127 に答える