Menu
Coddy logo textTech

**kwarg について

CoddyのPythonジャーニー「Object Oriented Programming」セクションの一部 — レッスン 43/64。

**kwargs は「keyword arguments(キーワード引数)」の略です。これを使用すると、事前すべてを定義することなく、関数が任意の数の名前付き引数(key=value ペアなど)を受け取ることが可能になります。

仕組み:

  • *args → 追加の位置引数をタプルにまとめます
  • **kwargs → 追加のキーワード引数を辞書にまとめます

簡単な例

最もシンプルな例から始めましょう:

def greet(**kwargs):
    print(kwargs)

greet(name="Alice", age=25, country="Australia")

出力:

{'name': 'Alice', 'age': 25, 'country': 'Australia'}

ご覧の通り、**kwargs はすべてのキーワード引数を自動的に辞書にまとめます。

辞書の使用

kwargs はすでに辞書であるため、直接ループ処理を行うことができます。

def print_info(**kwargs):
    print("Information received:")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="Bob", age=30, job="Teacher")

出力:

Information received:
name: Bob
age: 30
job: Teacher

通常の引数と **kwargs の組み合わせ

通常の引数と **kwargs を組み合わせることができます:

def create_profile(name, **details):
    print(f"Creating profile for: {name}")
    print("Additional details:")
    for key, value in details.items():
        print(f"  {key}: {value}")

create_profile("Sarah", age=28, city="London", hobby="Reading")

出力:

Creating profile for: Sarah
Additional details:
  age: 28
  city: London
  hobby: Reading

空の **kwargs

キーワード引数が渡されない場合、kwargs は空の辞書になります:

def show_data(**kwargs):
    if kwargs:
        print("Data:", kwargs)
    else:
        print("No data provided")

show_data()  # 引数なし
show_data(item="apple")  # 引数あり

出力:

No data provided
Data: {'item': 'apple'}

実践的な例:**kwargs を使用したクラス

クラスで **kwargs を使用する方法は次のとおりです。

class Person:
    def __init__(self, name, **kwargs):
        self.name = name
        self.details = kwargs
    
    def show_info(self):
        print(f"Name: {self.name}")
        for key, value in self.details.items():
            print(f"{key}: {value}")

person = Person("Alice", age=25, city="New York", job="Engineer")
person.show_info()

出力:

Name: Alice
age: 25
city: New York
job: Engineer

辞書のアンパッキング

関数を呼び出す際に、辞書をアンパックすることもできます:

def display_settings(**kwargs):
    for setting, value in kwargs.items():
        print(f"{setting} = {value}")

settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings)  # 辞書をアンパックします

出力:

debug = True
verbose = False
timeout = 30

重要なポイント:

  • **kwargs はキーワード引数を辞書に収集します — 変換は不要です。すでに辞書になっています
  • kwargs という名前は慣習的なものです — ** の後には任意の名前を使用できます
  • 柔軟な関数シグネチャが必要な場合に使用します
  • オプションのパラメータや設定の処理に最適です
challenge icon

チャレンジ

簡単

このチャレンジでは、包括的なテストカバレッジを備えた人物作成システムを実装します。

実装のガイドとなる TODO コメントに従って、person_creator.py ファイルのみを編集する必要があります。このファイルには、さまざまなプロパティを持つ人物オブジェクトを作成および管理するためのクラス構造が含まれています。

チートシート

**kwargs パラメータを使用すると、メソッドは任意の数のキーワード引数を受け取ることができ、それらを辞書として収集します。

class Person:
    def __init__(self, name, **kwargs):
        self.name = name
        self.details = kwargs
    
    def show_info(self):
        print(f"Name: {self.name}")
        for key, value in self.details.items():
            print(f"{key}: {value}")

person = Person("Alice", age=25, city="New York", job="Engineer")

通常のパラメータ、*args、および **kwargs を組み合わせる例です:

class Logger:
    def log(self, level, *messages, **options):
        timestamp = options.get('timestamp', False)
        color = options.get('color', 'default')
        
        if timestamp:
            print("[2024-01-01 12:00:00]", end=" ")
        print(f"[{level}]", end=" ")
        for message in messages:
            print(message, end=" ")

logger = Logger()
logger.log("INFO", "User", "logged", "in", timestamp=True, color="green")

** を使用して、メソッドを呼び出す際に辞書を展開します:

settings = {"debug": True, "verbose": False, "log_level": "INFO"}
config = Config(**settings)  # 辞書を展開します

辞書メソッドを使用して **kwargs の値にアクセスします:

def get_setting(self, key, default=None):
    return self.settings.get(key, default)

# すべての kwargs をループで処理します
for key, value in self.settings.items():
    print(f"{key} = {value}")

自分で試してみよう

from person_creator import create_person

# 総合的なテストケースハンドラー
test_case = input()

if test_case == "basic_test":
    create_person(name="John", age=25, occupation="Engineer")
    # 出力:
    # Person created with properties:
    # name: John
    # age: 25
    # occupation: Engineer

elif test_case == "empty_test":
    create_person()
    # 出力:
    # Person created with properties:
    # (プロパティがないため、追加の出力はありません)

elif test_case == "many_properties":
    create_person(name="Alice", age=30, occupation="Doctor", city="New York", 
                 country="USA", hobby="Reading", email="alice@example.com")
    # 出力:
    # Person created with properties:
    # name: Alice
    # age: 30
    # occupation: Doctor
    # city: New York
    # country: USA
    # hobby: Reading
    # email: alice@example.com

elif test_case == "special_characters":
    create_person(name="Bob", email="bob@example.com", phone="123-456-7890")
    # 出力:
    # Person created with properties:
    # name: Bob
    # email: bob@example.com
    # phone: 123-456-7890

elif test_case == "numeric_keys":
    create_person(name="Charlie", age=35, height=175, weight=70)
    # 出力:
    # Person created with properties:
    # name: Charlie
    # age: 35
    # height: 175
    # weight: 70

elif test_case == "boolean_values":
    create_person(name="David", is_student=True, is_employed=False)
    # 出力:
    # Person created with properties:
    # name: David
    # is_student: True
    # is_employed: False

elif test_case == "nested_structures":
    create_person(name="Eve", hobbies=["Reading", "Swimming", "Coding"], 
                 address={"city": "Boston", "state": "MA", "zip": "02108"})
    # 出力:
    # Person created with properties:
    # name: Eve
    # hobbies: ['Reading', 'Swimming', 'Coding']
    # address: {'city': 'Boston', 'state': 'MA', 'zip': '02108'}

elif test_case == "unicode_characters":
    create_person(name="José", city="São Paulo", country="Brasil")
    # 出力:
    # Person created with properties:
    # name: José
    # city: São Paulo
    # country: Brasil
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Object Oriented Programmingのすべてのレッスン