Pythonの可変長引数を別の関数にそのまま渡す

可変長引数に引数を追加して別の関数に渡す方法。

キーワード可変長引数の変数kwargs (dict型)に要素を足して、 test2(param1, **kwargs)
のようにアスタリスクを2個つけて渡すだけだった。

def test1(param1, **kwargs):
    print("----------")
    print("test1 func")
    print param1
    print kwargs
    kwargs["param4"] = "added in test1()"
    test2(param1, **kwargs)

def test2(param1, **kwargs):
    print("----------")
    print("test2 func")
    print param1
    print kwargs

test1("tes1", param2="test2", param3="test3")

実行結果

----------
test1 func
tes1
{'param3': 'test3', 'param2': 'test2'}
----------
test2 func
tes1
{'param4': 'added in test1()', 'param3': 'test3', 'param2': 'test2'}

英語での名称

**args は、 可変長引数
variable length argument

**kwargs は、 キーワード可変長引数
keyworded variable length argument
と呼ぶっぽい。 kwargs の kw は keywordの短縮だった。

キーワード可変長引数を変数に入れる

キーワード可変長引数も引数なのだから、変数に入っているべきなのではないかと思ったけど、
PyCharmのエディタでエラーになる。

def test1_2(param1, **kwargs):
    print("----------")
    print("test1_2 func")
    print param1
    print kwargs

    for key,val in kwargs.items():
        exec(key + '=val')
    print param2

PyCharmのエディタで Unresolved reference 'param2' というエラーになる。

実行はできる。

----------
test1_2 func
tes1
{'param3': 'tes3', 'param2': 'tes2'}
tes2

変数の名前が決まっているなら、関数定義に足せばいいっぽい。

def test1_2(param1, param2, **kwargs):
    print("----------")
    print("test1_2 func")
    print param1
    print kwargs

    for key,val in kwargs.items():
        exec(key + '=val')
    print param2

test1_2("tes1", param2="tes2", param3="tes3")

https://stackoverflow.com/questions/18090672/convert-dictionary-entries-into-variables-python