はじめに
Pythonでは関数に引数を不定個数渡し,
Pythonにおける引数の渡し方
まずは知識の確認と,
引数をタプルや辞書として参照する
「タプル
リスト1 tuple sample
In [1]: def foo(a, *args):
...: print args
...:
...:
In [2]: foo(1, 2, 3, 4)
(2, 3, 4)
In [3]: foo(1)
()
同様に
リスト2 dict sample
In [4]: def bar(a, **kw):
...: print kw
...:
...:
In [5]: bar(1)
{}
In [6]: bar(1, b=2, c=3, d=4)
{'c': 3, 'b': 2, 'd': 4}
In [7]: bar(b=2, c=3, d=4, a=1)
{'c': 3, 'b': 2, 'd': 4}
タプルや辞書を渡し引数に展開させる
今度は逆にtupleが展開されて仮引数に束縛されるケースです。リスト3の例で,
リスト3
In [9]: def buzz(a, b, c):
...: print a, b, c
...:
...:
In [10]: xs = (1, 2, 3,)
In [11]: buzz(*xs)
1 2 3
最後は辞書が展開されて仮引数に束縛されるケースです
リスト4
In [12]: ys = {"c":1, "b":2, "a": 3}
In [13]: buzz(**ys)
3 2 1
組み合わせてみる
これらを組み合わせて使うことができます。
リスト5
In [14]: foo(*xs)
(2, 3)
この場合はxsの先頭から順番に要素が引数に割り当てられ,
リスト6
In [15]: bar(**ys)
{'c': 1, 'b': 2}
同様に辞書ysの場合は,
辞書とtupleの両方渡すことも可能ですが,
リスト7
In [16]: buzz(*xs, **ys)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
TypeError: buzz() got multiple values for keyword argument 'a'
ここまでのおさらいのための簡単なパズル
次のfを,
def f(**kw):
assert kw["class"] == 1
- ※ pythonでclassは予約語です。答えはこの記事の一番最後に。