はじめに
以下のsample.pyのfunc()のように引数に*args, **kwargsと書かれることがなにかと多いが何のことかを備忘録がてらまとめる。
def func(*args, **kwargs):
...
return hoge
まず、args, kwargsとは
- args -> arguments
- kwargs -> keyword arguments
のことである。
argumentは引数という意味であり、keywordは解説するまでもないであろう。
これらの解説の前にPythonの引数について確認をする。
Pythonの引数について
def func(a, b, c, d=1, e=2, f=3):
return
Pythonの関数には呼び出し時に変数を指定しなくても引数にデフォルトで値を設定する機能(アノテーション)がある。
※上の関数のd, e, fがそれに当たる
また、デフォルト値を設定する変数はデフォルト値を設定しない変数よりも後に配置する必要がある←重要
関数の実際の実行の仕方は以下のようになる。
>>>func(1, 1, 1) # a=1, b=1, c=1, d=1, e=2, f=3
>>>func(1, 1, 1, 2) # a=1, b=1, c=1, d=2, e=2, f=3
>>>func(1, 1, 1, e=10) # a=1, b=1, c=1, d=1, e=10, f=3
>>>func(1, 1, 1, 5, 6, 7) # a=1, b=1, c=1, d=5, e=6, f=7
>>>func(1, 1, 1, d=5, e=6, f=7) # a=1, b=1, c=1, d=5, e=6, f=7
では本題の*args, **kwargsに移る。
*argsについて
*argsにはデフォルト値が設定されていない引数の中で明示的に定義されていないものがタプル型として入る。
言葉よりも実際に確認した方がわかりやすいかと思う。
def func(a, b, *args):
print(a)
print(b)
print(args)
>>>func(1 ,2 ,3 ,4 ,5)
1
2
(3, 4, 5)
>>>func(1, 2)
1
2
()
関数funcは2つの引数a, bと*argsを取っており、引数の1つ目がaに2つ目がbに入り、残りがタプル型としてargsに入っているわけである。
引数を2つしか取らない場合はargsは空のタプルとなる。
**kwargsについて
**kwargsにはデフォルト値が設定されている引数の中で明示的に定義されていないものが辞書型として入る。
これも言葉よりも実際に確認した方がわかりやすいかと思う。
def func(a=1, b=2, **kwargs):
print(a)
print(b)
print(kwargs)
>>>func(a=1 ,b=2, c=3, d=4, e=5)
1
2
{'c': 3, 'd': 4, 'e': 5}
>>>func(1, 2)
1
2
{}
関数funcは2つの引数a, bと**kwargsを取っており、引数の1つ目がaに2つ目がbに入り、残りが辞書型としてkwargsに入っているわけである。
引数を2つしか取らない場合はkwargsは空の辞書となる。
*argsと**kwargsの合わせ技
まずはデフォルト値を設定する変数はデフォルト値を設定しない変数よりも後に配置する必要があるということを思い出す。
この規則により、引数の中でデフォルト値が設定されているものとされていないものの境目が決まる。
この境目を基準に、境目より前のデフォルト値が設定していないものが*argsにタプル型として入り、境目より後のデフォルト値が設定されているものが**kwargsに辞書型として入る。
def func(*args, **kwargs):
print(args)
print(kwargs)
>>>func(1, 2, a=3, b=4, c=5)
(1, 2) #args
{'a': 3, 'b': 4, 'c': 5} #kwargs
以下のようにもできる
def func(a, b, *args, c=1, d=2, **kwargs):
print(a)
print(b)
print(args)
print(c)
print(d)
print(kwargs)
>>>func(1, 2, 3, d=4, e=5)
1 #a
2 #b
(3) #args
1 #c : default
4 #d
{'e': 5} #kwargs
<参考>*単独で引数にとる場合
*以後の引数はデフォルト値を設定したものか**kwargsしか取れなくなる。
*argsと同時には使えない。
def func(a, b, *, c=1, d=2, **kwargs):
print(a)
print(b)
print(c)
print(d)
print(kwargs)
>>>func(1, 2, d=4, e=5)
1 #a
2 #b
1 #c : default
4 #d
{'e': 5} #kwargs