*args, **kwargs 可変長引数

今回は「たまに見かけるあのコード」として「*args」と「**kwargs」を紹介します。

ここで重要なのは「*」アスタリスクの数です。関数定義で引数に * と ** (1個または2個のアスタリスク)をつけると、任意の数の引数(可変長引数)を指定することができます。

*args, **kwargs という名前はあくまで慣例として使われているもので、 * と ** がついていれば他の名前でも問題ありません。

使用例(1)

def sample(*args, **kwargs):
    print(f'args: {type(args)}, {args}')
    print(f'kwargs: {type(kwargs)}, {kwargs}')
    return

このような関数があった場合をみてみます。

# 位置引数のみの場合
sample("あいう", 123, "えお")

# 実行結果 ---
# args: <class 'tuple'>, ('あいう', 123, 'えお')
# kwargs: <class 'dict'>, {}
# キーワード引数のみの場合
sample(x="あいう", y=123, z="えお")

# 実行結果 ---
# args: <class 'tuple'>, ()
# kwargs: <class 'dict'>, {'x': 'あいう', 'y': 123, 'z': 'えお'}
# 位置引数、キーワード引数の場合
sample("あいう", 123, z="えお")

# 実行結果 ---
# args: <class 'tuple'>, ('あいう', 123)
# kwargs: <class 'dict'>, {'z': 'えお'}

使用例(2)

def sample_2(name, *args, **kwargs):
    print(f'name: {name}')
    print(f'args: {type(args)}, {args}')
    print(f'kwargs: {type(kwargs)}, {kwargs}')
    return

つづいては上記のようなコードで確認します。

sample_2("マイケル")

# 実行結果 ---
# name: マイケル
# args: <class 'tuple'>, ()
# kwargs: <class 'dict'>, {}
sample_2("マイケル", 456)

# 実行結果 ---
# name: マイケル
# args: <class 'tuple'>, (456,)
# kwargs: <class 'dict'>, {}
sample_2("マイケル", 456, "けこ")

# 実行結果 ---
# name: マイケル
# args: <class 'tuple'>, (456, 'けこ')
# kwargs: <class 'dict'>, {}
sample_2("マイケル", 456, "けこ", x=789, y="さしす")

# 実行結果 ---
# name: マイケル
# args: <class 'tuple'>, (456, 'けこ')
# kwargs: <class 'dict'>, {'x': 789, 'y': 'さしす'}