[Python] `**` 문법으로 복잡한 코드를 간단하게: 딕셔너리 언패킹과 키워드 인자 사용법
Python **
문법으로 복잡한 코드를 간단하게: 딕셔너리 언패킹과 키워드 인자 사용법
Python에서 **
문법은 딕셔너리를 언패킹하거나 가변 키워드 인자를 받아, 함수 호출을 더 유연하게 하고 코드 작성을 훨씬 간단하게 만들어줍니다. 특히, 반복적인 코드나 설정값이 많은 함수에서 불필요한 부분을 줄여, 코드가 읽기 쉽고 유지보수하기 쉬워집니다.
1. **kwargs
로 가변 키워드 인자 받기
함수에 많은 인자를 전달해야 하거나 인자의 수가 변동적일 때, **kwargs
를 사용하면 필요한 인자만 딕셔너리 형태로 받아 쉽게 처리할 수 있습니다. 여러 개의 키워드 인자를 사용하는 경우 **kwargs
가 없으면 함수 호출이 복잡해질 수 있습니다.
def user_info(name, age, **kwargs):
print(f"Name: {name}, Age: {age}")
for key, value in kwargs.items():
print(f"{key.capitalize()}: {value}")
# 사용 예시
user_info("Alice", 30, location="New York", job="Engineer", hobby="Reading")
설명
위 예제에서 **kwargs
를 사용하여 임의의 키워드 인자를 받아 처리할 수 있습니다. user_info
함수에 location
, job
, hobby
와 같은 인자를 추가해도 함수 정의를 바꿀 필요가 없습니다. 예전 방식으로 하려면 인자마다 함수 정의를 변경해야 했겠지만, **kwargs
를 통해 더 깔끔하고 유연하게 코드를 작성할 수 있습니다.
2. 딕셔너리 언패킹으로 함수 호출을 간단히
기존 방식에서는 딕셔너리의 각 값을 하나씩 인자로 전달해야 했습니다. 그러나 **
를 사용하면 딕셔너리를 바로 언패킹하여, 각 키를 인자명으로, 값을 인자 값으로 함수에 전달할 수 있습니다. 이로써 불필요한 반복을 줄이고, 코드 가독성을 높일 수 있습니다.
def display_order(item, price, quantity):
print(f"Item: {item}, Price: {price}, Quantity: {quantity}")
order = {
"item": "Laptop",
"price": 1200,
"quantity": 1
}
# 기존 방식
# display_order(order["item"], order["price"], order["quantity"])
# 언패킹 사용
display_order(**order)
설명
display_order(**order)
는 딕셔너리 order
의 키-값 쌍을 자동으로 언패킹하여 함수 인자로 전달합니다. 이전 방식에서는 각각의 키를 지정하여 값을 하나하나 전달해야 했지만, **
를 사용하면 더 간단하고 직관적인 코드가 됩니다.
3. 기본값 설정이 많은 함수에서 **
로 코드 단순화하기
기본값이 많은 함수에서 **
를 사용하면, 코드가 짧아지고 관리하기 쉬워집니다. 기본 설정값을 가진 딕셔너리와 **kwargs
를 함께 사용하여 특정 설정값만 쉽게 오버라이드할 수 있습니다.
def setup_environment(**config):
# 기본 설정값
default_config = {
"resolution": "1080p",
"color": "blue",
"fullscreen": True
}
# 전달된 값만으로 기본값을 덮어씁니다.
final_config = {**default_config, **config}
for key, value in final_config.items():
print(f"{key.capitalize()}: {value}")
# 사용 예시 - 일부 설정값만 오버라이드
setup_environment(resolution="4K", color="green")
설명
이 예제에서 setup_environment
함수는 default_config
딕셔너리와 config
를 병합하여 최종 설정을 자동으로 조정합니다. 예전 방식대로라면 기본값을 개별적으로 지정하거나 모든 설정을 한꺼번에 전달해야 했지만, **
문법을 통해 필요한 부분만 선택적으로 변경할 수 있어 코드가 더 유연해집니다.
4. 딕셔너리 병합하기
Python 3.9 이상에서는 **
문법을 사용해 여러 딕셔너리를 간단히 병합할 수 있습니다. 이전 방식에서는 update()
메서드나 반복문을 사용해야 했던 불편함이 있었지만, **
를 활용하면 훨씬 간결해집니다.
default_settings = {"theme": "dark", "font": "Arial"}
user_settings = {"font": "Helvetica", "fontsize": 12}
# 여러 딕셔너리를 한 번에 병합
settings = {**default_settings, **user_settings}
print(settings)
설명
{**default_settings, **user_settings}
를 사용하여 두 딕셔너리를 손쉽게 병합할 수 있습니다. 중복된 키가 있을 경우, user_settings
의 값이 우선 적용됩니다. 이 방법은 코드 작성과 유지보수가 간편해지며, 특히 설정값을 다룰 때 유용합니다.
5. 클래스 인스턴스 생성 시 유연하게 인자 전달하기
클래스를 사용할 때 **
문법을 통해 유연하게 인자를 전달하면, 인스턴스 생성 과정에서 불필요한 코드를 줄일 수 있습니다. 특히 클래스 속성이 많을 때 편리합니다.
class Product:
def __init__(self, **attributes):
for key, value in attributes.items():
setattr(self, key, value)
# 딕셔너리로 속성 값을 한 번에 전달
product_info = {"name": "Laptop", "price": 1200, "stock": 5}
product = Product(**product_info)
print(product.__dict__)
설명
위 코드에서 Product
클래스의 __init__
메서드는 **attributes
를 사용해 여러 속성을 한꺼번에 추가합니다. 이렇게 하면 클래스의 속성이 많을 때도 인스턴스를 간단하게 생성할 수 있습니다. 기존 방식대로라면 인스턴스를 생성할 때 속성을 일일이 지정해줘야 했지만, **
를 사용하면 코드가 훨씬 간결해집니다.
요약: Python에서 **
문법으로 코드 간소화하기
Python의 **
문법은 다음과 같은 방식으로 복잡한 코드를 간소화합니다.
- 함수에서 가변 키워드 인자를 받아, 불필요한 함수 정의 수정 없이 다양한 인자를 처리할 수 있음.
- 딕셔너리의 키-값 쌍을 언패킹하여 함수에 간편히 전달할 수 있음.
- 기본 설정값을 딕셔너리로 관리하고, 필요한 부분만 오버라이드할 수 있어 유연한 코드 작성 가능.
- 여러 딕셔너리를 손쉽게 병합하여 관리할 수 있음.
- 클래스 인스턴스를 생성할 때 동적으로 속성 추가가 가능해짐.
이처럼 **
문법은 코드의 가독성과 유지보수성을 크게 개선하므로, Python을 더 효율적으로 사용하고 싶다면 이 문법을 익혀두세요!