*args와 **kwargs는 「개수가 정해지지 않은 인자를 받는」 매개변수 패턴입니다.
함수가 임의의 개수의 위치 인자나 키워드 인자를 받을 수 있게 해 줍니다.
*args — 위치 인자를 튜플로 받음.
def sum_all(*args): return sum(args).
sum_all(1, 2, 3) — 6.
sum_all(1, 2, 3, 4, 5) — 15.
인자가 몇 개든 args 튜플에 담깁니다.
「args」 이름은 관례 — 「nums, items, values」 어떤 이름이든 OK이지만 args가 가장 흔합니다.
**kwargs — 키워드 인자를 딕셔너리로 받음.
def show(**kwargs): for k, v in kwargs.items(): print(f"{k}={v}").
show(name="홍", age=30) — "name=홍 / age=30".
키워드 인자가 몇 개든 kwargs 딕셔너리에 담깁니다.
둘 다 함께 쓰는 패턴이 매우 흔합니다.
def func(*args, **kwargs): pass.
데코레이터·래퍼 함수에서 「원본 함수가 어떤 인자를 받든 그대로 전달」할 때 표준입니다.
def wrapper(*args, **kwargs): return original(*args, **kwargs).
정의·호출에서 *와 **의 의미.
「정의」할 때 *args는 「여러 인자를 묶기」, 「호출」할 때 *list는 「리스트를 풀어 인자로 넘기기」.
nums = [1,2,3]; print(*nums)는 print(1,2,3)과 같음.
정의와 호출에서 「묶기 vs 풀기」의 두 의미를 가진다는 점이 처음에는 헷갈립니다.
한 줄 요약
*args는 위치 인자를 튜플로, **kwargs는 키워드 인자를 딕셔너리로 받습니다.
데코레이터·래퍼 함수의 「인자 그대로 전달」 패턴에서 표준입니다.
더 알아볼 것
- 키워드 전용 매개변수 (*, ...)
- 위치 전용 매개변수 (.../)
- 함수 시그니처와 호출의 모든 형식