Python 関数で *args と **kwargs を使用する方法

Python の *args と **kwargs をマスターします。動的な位置引数とキーワード引数を使用した柔軟な関数の作成方法、コレクションのアンパック方法、およびラッパー関数の構築方法を学びます。

エディターでこのソリューションを試してください

概要

Python では、多くの場合、可変数の引数を受け入れることができる関数を設計する必要があります。たとえば、任意の数の整数の合計を計算する関数や、さまざまなフィールドのメタデータをログに記録する関数などです。ユーザーにリストや辞書を渡すことを強制する代わりに、Python は 2 つの特別なシンボル、`*args` と `**kwargs` を提供します。

`*args` 構文を使用すると、関数は任意の数の位置引数を受け入れることができます。単一のアスタリスク `*` はアンパック演算子として機能します。関数定義に配置すると、追加の位置引数を `args` という名前のタプルに収集します。これにより、入力値を反復処理したり、計算を実行したり、それらを別の関数に簡単に渡したりすることができます。

一方、`**kwargs` 構文を使用すると、関数は任意の数のキーワード (名前付き) 引数を受け入れることができます。二重アスタリスク `**` は、これらの引数を `kwargs` という名前の辞書に収集します。これは、オプションの構成、スタイル引数、またはデータベース属性を渡す場合に非常に便利です。 「args」と「kwargs」という名前は慣例であることに注意してください。実際の機能は、一重アスタリスクと二重アスタリスクによって決まります。

コードと実行の出力

このコードは、*args を使用して変数の数値を合計し、**kwargs を使用してユーザー プロファイルを出力し、両方を 1 つの関数で組み合わせることを示しています。

def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

def print_profile(**kwargs):
    print("kwargs type:", type(kwargs).__name__)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
端子出力
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

段階的な実装

  • 位置引数をタプルに集めるには、パラメータ (*args など) の前に単一のアスタリスクを使用します。
  • キーワード引数を辞書に収集するには、パラメーターの前に二重アスタリスク (**kwargs など) を使用します。
  • 標準パラメータ、*args、キーワードのみのパラメータ、**kwargs という正しいパラメータ順序を維持します。
  • *iterable または **dictionary を渡して関数を呼び出すときは、アンパック構文を使用します。

よくある質問

「args」と「kwargs」という名前を使用する必要がありますか?

いいえ、これらは標準的なコミュニティの慣例です。構文的に必要なのは * および ** プレフィックスのみです。 *value と **options を書くこともできますが、読みやすさを考慮して *args と **kwargs にこだわることを強くお勧めします。

関数を定義するときの正しい順序は何ですか?

関数シグネチャ内の引数の正しい順序は、位置引数、*args、キーワードのみの引数、最後に **kwargs です。

関連トピック

推奨される Python リソース

関連するインタラクティブなチュートリアル、チートシート、コード比較で知識を深めてください。