Python - args, kwargs 이해하기(가변인자란?)
파이썬 args, kwargs 이해하기(가변인자란?)
*args, **kwargs는 함수에 가변 개수의 인수를 전달하는 데 사용되는 Python의 특수 구문이다. 임의의 여러 개의 위치 및 키워드 인수를 허용할 수 있다.
*args:
이 표기법을 사용하면 가변 개수의 위치 인수를 함수에 전달할 수 있다. arguments의 줄임말이다. *args은 튜플로 함수에 전달된 추가 위치 인수를 전달한다.
**kwargs:
이 표기법을 사용하면 가변 개수의 키워드 인수를 함수에 전달할 수 있다. “kwargs”라는 용어는 “keyword arguments”의 줄임말이다. 구문 은 **kwargs함수에 사전으로 전달된 추가 키워드 인수를 전달한다.
사용 예시
다음은 *args 와 **kwargs. 사용법을 보여주는 예시이다.
def example_function(arg1, *args, kwarg1=None, **kwargs):
print("arg1:", arg1)
print("args:", args)
print("kwarg1:", kwarg1)
print("kwargs:", kwargs)
example_function(1, 2, 3, kwarg1=4, kwarg2=5)
출력 결과
arg1: 1
args: (2, 3)
kwarg1: 4
kwargs: {'kwarg2': 5}
예제 설명
- arg1 : 정규 위치 인수(regular positional argument)이다.
- *args : 이후의 추가 위치 인수를 전달 받으면 arg1튜플에 저장한다.
- kwarg1 : 기본값이 있는 키워드 인수이다.
- **kwargs : 함수 서명에 명시적으로 언급되지 않은 추가 키워드 인수를 전달받아 사전에 저장한다.
(*args, **kwargs를 설명하때 영어에서 capture(캡쳐) 한다는 표현이 사용되고 있다. 전달받은 인수를 분류하여 알맞게 조정한다는 의미로 해석된다.)
*args는 추가 위치 인수를 캡처하는 데 사용되며 **kwargs는 추가 키워드 인수를 캡처하는 데 사용된다. 파이썬에서는 이렇게 서로 다른 개수의 인수를 처리해야 하는 함수를 정의할 때 유연성을 제공한다.
참고
*args와 **kwars에서 *, ** 다음에 이름은 관습적으로 쓰일 뿐이며, 고정되어 있는 예약 키워드는 아니다.
def example_function(arg1, *some_name_args, kwarg1=None, **some_name_kwargs):
print("arg1:", arg1)
print("args:", some_name_args)
print("kwarg1:", kwarg1)
print("kwargs:", some_name_kwargs)
example_function(1, 2, 3, kwarg1=4, kwarg2=5)
asterisk * & double asterisk **
Python에서 별표 *와 이중 별표는 **특정 컨텍스트에서 사용될 때 특정한 의미를 갖는다.
*(별표) - Iterables 및 가변 길이 인수 목록의 패킹 풀기:
*iterable(예: 리스트, 튜플)에서 요소를 패킹 해제하고 별도의 인수로 함수에 전달하는 데 사용된다. 함수 정의에서 *args추가 위치 인수를 튜플로 수집한다.
**(이중 별표) - 사전(Dictionaries) 및 키워드 인수의 패킹 풀기:
**사전에서 키-값 쌍의 패킹을 해제하고 별도의 키워드 인수로 함수에 전달하는 데 사용된다. 함수 정의에서 **kwargs추가 키워드 인수를 사전으로 수집한다.
용도 요약
* (별표)
(1) 패킹 해제(Unpacking) : *iterable함수 호출 또는 할당을 위해 iterable(예: 목록, 튜플)의 요소를 패킹 해제한다.
(2) 기능 정의: *args추가 위치 인수를 튜플로 수집한다.
** (이중 별표)
(1) 패킹 해제(Unpacking) : **dictionary함수 호출에 대한 사전의 키-값 쌍을 패킹 해제한다.
(2) 기능 정의: **kwargs추가 키워드 인수를 사전으로 수집한다.
# Unpacking
numbers = [1, 2, 3]
print(*numbers) # Unpacks and prints: 1 2 3
data = {'x': 10, 'y': 20}
print(**data) # Raises an error, ** used with dictionaries is typically for function calls
# Function Definitions
def example_function(arg1, *args, kwarg1=None, **kwargs):
pass
# Function Calls
example_function(1, 2, 3, kwarg1=4, kwarg2=5)
댓글남기기