Pythonの可変長引数(*args, **kwargs)
Python では、関数定義で引数に * または **(1個または2個のアスタリスク)を付けると、任意の数の引数(可変長引数)を受け取ることができます。
- *args:複数の引数をタプルとして受け取る
- **kwargs:複数のキーワード引数を辞書(dict)として受け取る
Python の辞書(dict)の基本的な使い方は、以下の記事を参照ください。
-
-
関連記事Pythonの辞書(dict)に要素を追加・削除・連結する方法
Pythonの辞書(dict)について、要素(key, value)のペアを追加、任意の要素の削除、全要素の削除、また辞書同士を連結する方法についてまとめています。keyが存在する場合・存在しない場合で挙動が異なるので注意が必要です。
続きを見る
*args:複数の引数をタプルとして受け取る
Python では、*args のように * をつけた引数を定義するだけで、
任意の数の引数を指定することができます。
1 2 3 4 5 6 7 8 9 |
def log(*args): print('type:', type(args)) print('args: ', args) log('Python', 'is', 'very', 'fun!') # type: <class 'tuple'> # args: ('Python', 'is', 'very', 'fun!') |
可変長引数を使わない場合
1 2 3 4 5 6 7 8 9 10 |
def log2(args): print('type: ', type(args)) message = ', '.join(str(x) for x in args) print(message) log2(['Python', 'is', 'very', 'fun!']) # type: <class 'list'> # Python, is, very, fun! |

**kwargs:複数のキーワード引数を辞書(dict)として受け取る
Python では、**kwargs のように ** をつけた引数を定義すると、
任意の数のキーワード引数を指定することができます。
受け取った関数の中では、引数名がキー key、値が value となる辞書として扱えます。
1 2 3 4 5 6 7 8 9 |
def log3(**kwargs): print('type: ', type(kwargs)) print('kwargs: ', kwargs) log3(tag='PIP', message='PIP is python module.') # type: <class 'dict'> # kwargs: {'tag': 'PIP', 'message': 'PIP is python module.'} |
注意ポイント
** を付けた引数は、普通の位置引数と合わせて使用できますが、
** を付けた引数は最後に定義する必要があります。
*argsや**kwargsを使用する際に覚えておくべき注意点
- * や ** とジェネレーター(yield)を一緒に使うとメモリを使い果たしてクラッシュする場合がある(どこまでも引数として保持してしまう)
- *args を使っていた関数に新たに位置引数を追加すると、発見が困難な不具合を生みだしてしまう可能性がある(呼出し元の変更を忘れた場合、引数がズレる)