Python の Args と Kwargs

PythonBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Python における*argsと**kwargsについて学習します。これらの特殊な構文は、最初は難しそうに見えるかもしれませんが、理解すれば非常に簡単であり、関数の柔軟性を高める強力な方法を提供します。可変長の引数を受け入れる関数を定義する方法を学びますが、これは多くの Python プログラムやライブラリで一般的かつ有用な機能です。

Args と Kwargs

このステップでは、*args と **kwargs の基本的な構文について学習します。これらは、関数定義において、不定数の引数を受け入れるために使用されます。*args はキーワードなしの位置引数用であり、**kwargs はキーワード引数用です。

注記: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、まずこちらの実験 (lab)で学習してください。

まず、あらゆる引数の組み合わせを受け入れられる関数を定義する方法を見てみましょう。左側のファイルエクスプローラーで、~/project ディレクトリにあるファイル main.py を見つけ、エディタで開きます。

main.py に次のコードを追加します。

## あらゆる数の位置引数とキーワード引数を受け入れる関数を定義
def some_function(*args, **kwargs):
    print("This function can accept any arguments.")
    print(f"Received positional arguments: {args}")
    print(f"Received keyword arguments: {kwargs}")
    print("-" * 20)

## あらゆる数の位置引数で呼び出す
some_function('arg1', 'arg2', 'arg3')

## あらゆる数のキーワード引数で呼び出す
some_function(key1='arg1', key2='arg2', key3='arg3')

## 位置引数とキーワード引数の両方で呼び出す
some_function('positional_arg', key1='keyword_arg')

## または引数なしで呼び出す
some_function()

args と kwargs は単なる命名規則であることに注意することが重要です。実際の処理を行う構文は、単一のアスタリスク (*) と二重アスタリスク (**) です。ただし、この慣習に従うことは Python コミュニティでは良い習慣と見なされています。

次に、WebIDE でターミナルを開き、次のコマンドを実行してスクリプトを実行します。

python3 main.py

関数が異なる呼び出しをどのように処理するかを示す、次の出力が表示されるはずです。

This function can accept any arguments.
Received positional arguments: ('arg1', 'arg2', 'arg3')
Received keyword arguments: {}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {'key1': 'arg1', 'key2': 'arg2', 'key3': 'arg3'}
--------------------
This function can accept any arguments.
Received positional arguments: ('positional_arg',)
Received keyword arguments: {'key1': 'keyword_arg'}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {}
--------------------

これは、*args が位置引数をタプルに集め、**kwargs がキーワード引数を辞書に集めることを示しています。

*args

このステップでは、*argsに特化して焦点を当てます。この構文により、関数は任意の数の位置引数を受け入れることができます。これらの引数はタプルにまとめられます。

main.pyから以前の内容を消去し、以下のコードを追加してください。この例では、*argsを受け取り、受け取った引数とその型を出力する関数を定義します。

## *args は位置引数をタプルにまとめる
def some_function(*args):
    print(f'Arguments passed: {args} as {type(args)}')

## 複数の引数を渡す - これらは args タプルにまとめられる
some_function('arg1', 'arg2', 'arg3')

このコードでは、関数シグネチャ内の*argsは、some_functionに渡された余分なすべて位置引数を収集し、argsという名前のタプルに入れるように Python に指示しています。

それでは、ターミナルからスクリプトを実行してください。

python3 main.py

出力は、引数がタプルとして渡されたことを確認します。

Arguments passed: ('arg1', 'arg2', 'arg3') as <class 'tuple'>

これは、*argsが、それぞれの引数を個別のパラメーターとして定義することなく、可変長の入力を処理するための簡単な方法を提供することを示しています。

**kwargs

このステップでは、**kwargsの使用方法について学習します。この構文は、任意の数のキーワード引数を辞書(dictionary)に収集するために使用されます。これは、事前に定義していない名前付き引数を処理したい場合に役立ちます。

main.pyの内容を消去し、以下のコードを追加してください。この例では、**kwargsを受け入れ、収集されたキーワード引数とその型を出力する関数を定義します。

## **kwargs はキーワード引数を辞書にまとめる
def some_function(**kwargs):
    print(f'keywords: {kwargs} as {type(kwargs)}')

## キーワード引数を渡す - これらは kwargs 辞書にまとめられる
some_function(key1='arg1', key2='arg2')

ここで、関数シグネチャ内の**kwargsは、some_functionに渡されたすべてのキーワード引数をkwargsという名前の辞書に収集するように Python に指示します。辞書のキーは引数名であり、値は引数の値です。

ターミナルからスクリプトを実行してください。

python3 main.py

出力は、キーワード引数が辞書に収集されたことを示します。

keywords: {'key1': 'arg1', 'key2': 'arg2'} as <class 'dict'>

この機能は、オプションや設定を渡す必要がある関数で Python で広く使用されており、クリーンで読みやすい関数呼び出しを可能にします。

まとめ

この「実験」(Lab)では、Python で*argsと**kwargsを使用して、より柔軟な関数を作成する方法を学びました。

以下の点を学びました。

  • *argsは、可変長の位置引数をタプルに収集します。
  • **kwargsは、可変長のキーワード引数を辞書に収集します。
  • argsとkwargsは慣習的な名前ですが、この機能を実現するのは*と**の構文です。

*argsと**kwargsを習得することは、より高度で再利用性の高い Python コードを書くための重要なステップです。これにより、さまざまな種類の入力に適応できる関数を作成できるようになります。