Pythonの**kwargs(キーワード引数)について
**kwargs
は、Pythonの関数定義で使われる非常に便利な機能です。関数に任意の数のキーワード引数(名前付き引数)を渡すために使用されます。kwargsは「キーワード引数」を意味し、**
はそれらを辞書として展開するという意味です。
**kwargsの基本的な使い方
関数に**kwargs
を使用すると、任意のキーワード引数を受け取ることができます。これらの引数は辞書形式で関数内に渡されます。
例1:**kwargsを使った関数の定義
def my_function(**kwargs):
print(kwargs)
my_function(name="John", age=25, city="New York")
この場合、出力は次のようになります。
{'name': 'John', 'age': 25, 'city': 'New York'}
ここで、kwargs
は関数に渡されたキーワード引数を含む辞書になっています。
解説
**kwargs
は複数のキーワード引数を辞書として受け取ることができます。関数呼び出し時に、何個でも引数を渡すことができ、それらが辞書として渡されます。
関数内でkwargs
を辞書として扱うことで、特定のキーにアクセスしたり、以下のようにループで全てのキーと値を処理したりできます。
例2:**kwargsで引数を処理する
def my_function(**kwargs):
for key, value in kwargs.items():
print(f"{key} = {value}")
my_function(name="Alice", age=30, job="Engineer")
出力
name = Alice
age = 30
job = Engineer
**kwargsの用途
- オプションの引数を受け取る場合
関数に必須ではない複数の引数を渡したい場合に便利です。ユーザーが任意の数の引数を渡すことができ、その引数を辞書形式で処理できます。 - 動的な引数の処理
引数の数や名前が事前にわからない状況で、関数が柔軟に引数を処理できるようにします。
可変長引数(*args)との違い
*args
は位置引数(非キーワード引数)をタプルとして受け取るのに対し、**kwargs
はキーワード引数を辞書として受け取ります。*args
は複数の引数を、**kwargs
は複数のキーワード引数を扱うために使用されます。
例3:*argと**kwargsを組み合わせた関数
def my_function(*args, **kwargs):
print("args:", args)
print("kwargs:", kwargs)
my_function(1, 2, 3, name="Bob", age=40)
出力
args: (1, 2, 3)
kwargs: {'name': 'Bob', 'age': 40}
Pydanticにおける**kwargsを使用した代入
以下のように、Pydantic
モデルへ**kwargs
を使ってデータを代入できます。この手法は、特に外部データソースからのデータを受け取る場合に便利です。
from pydantic import BaseModel
from typing import Union
class User(BaseModel):
username: str
password: Union[str, None] = None
#;
src_dict = { "username": "Taro", "password": "secret" }
user = User(**src_dict)
上記のuser = User(**src_dict)
は次のコードと同じになります。
User(
username = dict["username"],
password = dict["password"]
)
実行例
from pydantic import BaseModel
from typing import Union
class User(BaseModel):
username: str
password: Union[str, None] = None
#;
src_dict = { "username": "Taro", "password": "secret" }
user = User(**src_dict)
print(user)
src_dict = { "username": "Taro" }
user = User(**src_dict)
print(user)
# Userのフィールドにないキーは無視される
src_dict = { "username": "Taro", "password": "secret", "ext": -1 }
user = User(**src_dict)
print(user)
username='Taro' password='secret'
username='Taro' password=None
username='Taro' password='secret'
なお、必須のフィールドに該当するキーが辞書に存在しない場合、エラーが発生します。
from pydantic import BaseModel
from typing import Union
class User(BaseModel):
username: str
password: Union[str, None] = None
#;
src_dict = { "password": "secret" }
user = User(**src_dict) # pydantic.error_wrappers.ValidationError
**kwargsのまとめ
**kwargs
は、関数に任意の数のキーワード引数を渡すための機能で、これらの引数は辞書として関数内でアクセスできる- 柔軟性が高く、複数のオプション引数を扱う場合や、引数の名前や数が動的に変わる場面で役立つ