*args와 는 함수가 의 인수를 받을 수 있게 합니다. 는 추가 인수를 튜플로 모으고, 는 추가 인수를 dict로 모읍니다. (이름은 관례이며 — 중요한 것은 와 입니다.)
**kwargs*args**kwargs***def total(*args): # 모든 위치 인수를 튜플로 모음
print(args) # 예: (1, 2, 3)
return sum(args)
total(1, 2, 3) # 6
total(1, 2, 3, 4, 5) # 15 — 임의의 개수의 인수
def configure(**kwargs): # 키워드 인수를 dict로 모음
print(kwargs) # 예: {"host": "localhost", "port": 8080}
for key, value in kwargs.items():
print(f"{key} = {value}")
configure(host="localhost", port=8080, debug=True)
def func(a, b, *args, **kwargs):
# a, b → 필수 위치
# args → 추가 위치 (튜플)
# kwargs → 추가 키워드 (dict)
...
func(1, 2, 3, 4, x=5, y=6)
# a=1, b=2, args=(3, 4), kwargs={"x": 5, "y": 6}
필요한 순서는: 일반 매개변수, 그다음 *args, 그다음 **kwargs입니다.
# `*`와 `**`는 호출 지점에서 컬렉션을 인수로 언패킹하기도 함
numbers = [1, 2, 3]
total(*numbers) # total(1, 2, 3)과 동일
settings = {"host": "x", "port": 80}
configure(**settings) # configure(host="x", port=80)과 동일
동일한 문법이 list/dict를 위치/키워드 인수로 언패킹합니다 — 인수 전달에 유용합니다.
def wrapper(*args, **kwargs):
# 어떤 인수든 받아 변경 없이 그대로 전달
return original_func(*args, **kwargs)
이 통과(pass-through) 패턴은 decorator와 wrapper 함수가 어떤 함수 시그니처든 처리하는 방법입니다.
*args/**kwargs는 임의의 개수의 인수를 받는 유연한 함수 시그니처를 가능하게 합니다 — 범용 유틸리티, wrapper, 그리고 특히 decorator(*args, **kwargs를 통해 알 수 없는 시그니처의 함수를 감싸야 함)를 작성하는 데 필수적입니다.
언패킹 방향(*list, **dict)도 인수를 전달하거나 펼치는 데 똑같이 유용합니다.
모으기와 언패킹을 모두 이해하는 것은 재사용 가능하고 일반적인 Python 코드를 작성하고, 이 기능들에 의존하는 많은 라이브러리 API와 decorator를 읽는 데 핵심입니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기