LoginSignup
35
25

More than 3 years have passed since last update.

Pythonの特殊な引数 *args **kwargsの意味

Posted at

はじめに

Pythonのデコレータで、ラッパー関数の引数がdef wrapper(*args, **kwargs):となっているのを見て、*args**kwargsはどういう物?と思い、調べてみました。

関数の引数として使う *args**kwargs

関数の引数で、*args**kwargsを使うと、どんな引数でも受け取れる関数が作れます。
*argsは任意の数の引数を許可し、argsという名前のタプルに割り当てられます。
**kwargsは任意の数のキーワード引数を許可し、kwargsという名前の辞書(dict)に割り当てられます。

サンプルコード

python
def fn(*args, **kwargs):
  print("*args:", args)
  print("*kwargs:", kwargs)

#(1)任意の数の引数を指定
fn(11, "aa", ["ラーメン", "素麺"])
#-> *args: (11, 'aa', ['ラーメン', '素麺'])
#-> *kwargs: {}

#(2)任意の数のキーワード引数を指定
fn(key1=22, key2="bb", key3=["パスタ", "スープ"])
#-> *args: () 
#-> *kwargs: {'key1': 22, 'key2': 'bb', 'key3': ['パスタ', 'スープ']}

#(3)混在
fn(11, "aa", key1=22, key2="bb")
#-> *args: (11, 'aa')
#-> *kwargs: {'key1': 22, 'key2': 'bb'}

アンパック引数として使う *args**kwargs

別の使い方で、リストや辞書(dict)を引数として渡すとき、先頭に***をつけると、リストや辞書を分解して引数に渡せます。

サンプルコード

リストをアンパックして、各要素の値を引数で渡す例

python
def sample(p1, p2):
  print("p1=", p1)
  print("p2=", p2)

params = [111, "AAA"]
sample(*params)
#-> p1= 111
#-> p2= AAA

辞書(dict)をアンパックして、各要素の値をキーワード引数で渡す例

python
def sample(foo, bar):
  print("foo=", foo)
  print("bar=", bar)

params = { 'foo': 222, 'bar': "BBB" }
sample(**params)
#-> foo= 222
#-> bar= BBB
35
25
0

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
35
25