LoginSignup
96
93

More than 3 years have passed since last update.

[Python] *args, **kwargsって何? -引数の*(アスタリスク)-

Last updated at Posted at 2020-11-28

はじめに

以下のsample.pyのfunc()のように引数に*args, **kwargsと書かれることがなにかと多いが何のことかを備忘録がてらまとめる。

sample.py
def func(*args, **kwargs):
    ...
    return hoge

まず、args, kwargsとは

  • args -> arguments
  • kwargs -> keyword arguments

のことである。
argumentは引数という意味であり、keywordは解説するまでもないであろう。
これらの解説の前にPythonの引数について確認をする。

Pythonの引数について

arguments.py
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にはデフォルト値が設定されていない引数の中で明示的に定義されていないものがタプル型として入る。
言葉よりも実際に確認した方がわかりやすいかと思う。

args.py
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にはデフォルト値が設定されている引数の中で明示的に定義されていないものが辞書型として入る。
これも言葉よりも実際に確認した方がわかりやすいかと思う。

kwargs.py
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に辞書型として入る。

args_and_kwargs.py
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
96
93
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
96
93