🎃
*argsと**kwargsについて
初めに
今回は*argsと**kwargsについて解説します。
これらは可変長変数と呼ばれ、関数の引数に*と**をつけることで、任意の数の要素を受け取れるようになります。
慣例としてargsとkwargsが使用されますが、引数名に制限はありません。
*args
*argsは、通常の引数を複数個、タプルで受け取ります。
また、引数が渡されなかった場合は要素数0のタプルとなります。
コード例
def my_sum(*args):
print('args: ', args)
print('type: ', type(args))
print('sum : ', sum(args))
my_sum(1, 2, 3, 4)
# args: (1, 2, 3, 4)
# type: <class 'tuple'>
# sum : 10
my_sum()
# args: ()
# type: <class 'tuple'>
# sum : 0
**kwargs
**kwargsは、キーワード引数(名称が指定された引数)を複数個、辞書で受け取ります。
また、引数が渡されなかった場合は要素数0の辞書となります。
辞書を入力する場合、呼び出し側で**dとして展開する必要があります。
コード例
def func_kwargs(**kwargs):
print('kwargs: ', kwargs)
print('type: ', type(kwargs))
func_kwargs(key1=1, key2=2, key3=3)
# kwargs: {'key1': 1, 'key2': 2, 'key3': 3}
# type: <class 'dict'>
func_kwargs()
# kwargs: {}
# type: <class 'dict'>
d = {'key1':1, 'key2':2, 'key3':3}
func_kwargs(**d)
# kwargs: {'key1': 1, 'key2': 2, 'key3': 3}
# type: <class 'dict'>
使用上の注意
- *argsの後に引数を定義する場合、キーワード引数で指定する必要があります。**kwargsとの組み合わせも可能です。
- **kwargsの後に引数を定義することはできません。
1. *argsの後に引数を定義する場合、キーワード引数で指定する必要があります。
def func_args(arg1, *args, arg2):
print('arg1: ', arg1)
print('arg2: ', arg2)
print('args: ', args)
func_args(0, 1, 2, 3, 4)
# TypeError: func_args2() missing 1 required keyword-only argument: 'arg2'
func_args(0, 1, 2, 3, arg2=4)
# arg1: 0
# arg2: 4
# args: (1, 2, 3)
2. **kwargsとの組み合わせも可能です。
def func_args_kwargs(*args, **kwargs):
print(args)
print(kwargs)
func_args_kwargs(1, 2, A=3, B=4)
# (1, 2)
# {'A': 3, 'B': 4}
3. **kwargsの後に引数を定義することはできません。
def func_kwargs(arg1, **kwargs, arg2):
pass
# SyntaxError
まとめ
まとめると、*argsと**kwargsは、複数の要素をタプルと辞書で受け取ることができる、とても便利な符号でした。
それでは今回はここまでになります。読んでいただきありがとうございました!
参考:Pythonの可変長引数(*args, **kwargs)の使い方(Link)
Discussion