Python에서 ***를 함께 사용하기: 위치 인자와 키워드 인자 활용법

Python에서 ***를 동시에 사용하면 함수 호출 시 다양한 형태의 인자를 효율적으로 전달할 수 있습니다. 특히 함수에서 필수 인자, 위치 기반 인자, 키워드 인자를 모두 받을 때 ***는 강력한 도구가 됩니다. 이 가이드에서는 *args**kwargs를 함께 사용할 때의 구조와 다양한 예제를 통해 그 활용 방법을 소개합니다.


1. *args**kwargs의 기본 사용 구조

함수 정의 시 *args**kwargs를 함께 사용하면, 위치 기반 인자와 키워드 인자를 동시에 받아 처리할 수 있습니다. 위치 인자를 먼저 받고, 그다음 키워드 인자를 받기 때문에 함수 매개변수는 필수 인자 > *args > `kwargs`** 순서로 작성해야 합니다.

def mixed_function(a, b, *args, **kwargs):
    print(f"Required: {a}, {b}")
    print(f"Args (additional positional): {args}")
    print(f"Kwargs (additional keyword): {kwargs}")

# 호출 예시
mixed_function(1, 2, 3, 4, x=10, y=20)

출력 결과

Required: 1, 2
Args (additional positional): (3, 4)
Kwargs (additional keyword): {'x': 10, 'y': 20}

설명

  • ab는 필수 인자로, 반드시 값을 전달해야 합니다.
  • *args는 위치 인자 34를 튜플로 묶어 받습니다.
  • **kwargs는 키워드 인자 x=10y=20을 딕셔너리로 묶어 받습니다.
  • 이 구조 덕분에 함수 호출이 더욱 유연해지고, 필요에 따라 다양한 형태의 인자를 전달할 수 있습니다.

2. ***를 사용하여 동적으로 여러 인자 전달하기

***는 함수 호출 시에도 사용할 수 있어, 리스트와 딕셔너리를 동시에 언패킹하여 인자로 전달할 수 있습니다. 이는 복잡한 인자 전달을 한 줄로 간단히 표현할 수 있게 해줍니다.

def order_summary(main, side, drink, *args, **kwargs):
    print(f"Main: {main}, Side: {side}, Drink: {drink}")
    print(f"Additional toppings: {args}")
    print(f"Additional options: {kwargs}")

# 인자 설정
order_items = ["Burger", "Fries", "Cola"]
order_options = {"size": "Large", "extra_cheese": True}

# 리스트와 딕셔너리 동시 언패킹
order_summary(*order_items, "Bacon", "Onion", **order_options)

출력 결과

Main: Burger, Side: Fries, Drink: Cola
Additional toppings: ('Bacon', 'Onion')
Additional options: {'size': 'Large', 'extra_cheese': True}

설명

  • *order_items는 리스트 요소를 언패킹하여 main, side, drink 인자로 전달합니다.
  • "Bacon""Onion"*args로 전달되어 추가 토핑으로 분류됩니다.
  • **order_options는 딕셔너리를 언패킹하여 키워드 인자로 전달되므로, sizeextra_cheese 옵션이 적용됩니다.
  • ***를 함께 사용하면, 리스트와 딕셔너리를 필요한 위치에 맞춰 유연하게 전달할 수 있어 코드가 더욱 깔끔해집니다.

3. 클래스 초기화에서 *args**kwargs로 인자 관리하기

클래스 초기화 시 *args**kwargs를 함께 사용하면, 필수 속성 외의 추가 속성을 유연하게 받을 수 있어 클래스를 재사용하기 쉬워집니다.

class Product:
    def __init__(self, name, price, *args, **kwargs):
        self.name = name
        self.price = price
        self.features = args
        self.options = kwargs

    def show_info(self):
        print(f"Product Name: {self.name}")
        print(f"Price: {self.price}")
        print(f"Features: {self.features}")
        print(f"Options: {self.options}")

# 인스턴스 생성
item = Product("Laptop", 1200, "16GB RAM", "512GB SSD", color="Silver", warranty="2 years")
item.show_info()

출력 결과

Product Name: Laptop
Price: 1200
Features: ('16GB RAM', '512GB SSD')
Options: {'color': 'Silver', 'warranty': '2 years'}

설명

  • nameprice는 필수 속성으로 받습니다.
  • *args는 추가적인 기능 정보를 features 튜플로 저장합니다.
  • **kwargs는 옵션을 딕셔너리 형태로 받아 options에 저장합니다.
  • 기본 속성 외에도 추가 속성을 유연하게 받아 클래스를 다목적으로 활용할 수 있습니다.

4. 딕셔너리와 리스트 결합하기

*args**kwargs를 함께 사용하면, 딕셔너리와 리스트를 조합해 다양한 인자를 한 번에 처리할 수 있습니다. 이는 특히 설정값이나 다양한 옵션을 한꺼번에 전달할 때 유용합니다.

def configure_settings(*args, **kwargs):
    print(f"General Settings: {args}")
    print(f"Advanced Options: {kwargs}")

# 리스트와 딕셔너리 조합
general_settings = ["Dark Mode", "1080p"]
advanced_options = {"volume": 80, "brightness": 70}

configure_settings(*general_settings, **advanced_options)

출력 결과

General Settings: ('Dark Mode', '1080p')
Advanced Options: {'volume': 80, 'brightness': 70}

설명

  • *general_settings는 리스트를 언패킹하여 args로 전달합니다.
  • **advanced_options는 딕셔너리를 언패킹하여 kwargs로 전달합니다.
  • 이 방식으로 설정값과 고급 옵션을 깔끔하고 효율적으로 전달할 수 있습니다.

요약: ***를 함께 사용하는 이유와 장점

Python에서 *args**kwargs를 함께 사용하면, 함수나 클래스에서 위치 인자와 키워드 인자를 동시에 유연하게 처리할 수 있습니다. ***를 결합해 사용하면 코드의 가독성과 재사용성이 높아지며, 반복적이고 복잡했던 인자 전달 방식이 단순해집니다.

***의 동시 사용은 특히 다양한 인자 구성이 필요한 상황에서 매우 유용합니다. Python을 더욱 유연하고 효율적으로 사용하고 싶다면 이 문법을 익혀보세요!

+ Recent posts