🎃

*argsと**kwargsについて

2024/01/08に公開

初めに

今回は*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