*args는 임의의 개수의 위치 인수를 튜플로 수집합니다.
**kwargs는 임의의 개수의 이름이 지정된 인수(키=값)를 사전으로 수집합니다.
이것은 유연한 인터페이스를 가진 함수를 작성할 수 있게 해줍니다:
def my_func(a, b, *args, **kwargs): print(a, b) print(args) print(kwargs) my_func(1, 2, 3, 4, x=10, y=20) # 1 2 # (3, 4) # {'x': 10, 'y': 20}
세부 사항:
기본값이 있는 이름이 지정된 인수와 *args의 순서를 바꿀 수 있나요, 예를 들어:
def foo(a, *args, x=10, **kwargs): pass
혹은 반드시 항상 기본값을 *args 뒤에 두어야 하나요?
답변:
파이썬 3에서는 가능합니다! 이렇게 (파이썬 2에서는 작동하지 않았습니다):
def foo(a, *args, x=10): pass
*args 뒤의 매개변수("키워드 전용 인수")는 기본값을 가질 수 있거나 필수일 수 있으며, 이름을 통해서만 지정할 수 있습니다.
이야기
잘못된 인수를 *args/**kwargs를 통해 전달
REST API 서비스에서 데이터 마샬링 자동화는 **kwargs를 통해 이루어졌습니다. 불필요한 매개변수가 감지되지 않아 함수는 kwargs에 예상치 못한 값을 받아들여 제어 로직 손실 및 디버깅하기 어려운 버그가 발생하였습니다.
이야기
이름이 지정된 인수 중복
함수를 호출할 때 개발자가 매개변수를 명시적으로 그리고 **kwargs를 통해 동시에 지정했습니다, 예: my_func(a=1, **{"a": 2}). 결과적으로 — TypeError와 서비스가 중단되었습니다.
이야기
위치 인수 또는 이름이 지정된 인수 누락
데코레이터를 작성할 때 매개변수가 잘못 전달되면 (순서와 구조가 준수되지 않음) 원래 함수가 인수의 개수를 제대로 받지 못하게 되어 프로덕션에서 TypeError 호출 오류가 발생하게 되었습니다.