[Python] 가변인자, 패킹, 언패킹

익숙해 질듯 항상 헷갈리는 파이썬의 가변 인자에 대하여 정리합시다!

ICONFINDER

메서드를 수행할 때 필요한 입력값을 받는 변수를 의미합니다.
보통 메서드를 실행할 때 필요한 값을 넘기면 인자들은 입력값을 저장합니다.

위치 인자(Positional parameter)는 일반적으로 선언하는 인자를 의미합니다.

키워드 인자(Keyword parameter)는 인자 뒤에 param=default 형태로 기본 값을 선언해주면 입력값이 있을 땐 위치인자로 처리되고 값이 없을 때 default 값으로 처리됩니다. default parameter로 기억하면 좋습니다.

유의사항은 위치 인자 뒤에 키워드 인자 순서가 지켜져야 합니다.

가변인자에 대하여 알아보기 전에 패킹과 언패킹 의미를 정리해야 합니다.

패킹은 단어 뜻처럼 묶는 것을 의미합니다. 여러개의 값을 하나의 자료구조 데이터로 묶어 변수에 저장하는 것입니다.

>>> args = 1, 2, 3
>>> args
(1, 2, 3)

언패킹은 반대로 묶은 것을 푸는 것을 의미합니다. 자료구조 데이터의 요소를 여러개 변수에 나누어 저장하는 것입니다. 패킹시 * 를 붙인 변수는 남은 요소 전체를 리스트에 담아 저장합니다.

>>> a, b, c = args
>>> a
1
>>> b
2
>>> c
3
>>> x, *new_args = args
>>> x
1
>>> new_args
[2, 3]

위치, 키워드 인자의 개수가 많아지거나 인자의 수가 미정일 경우 가변인자를 사용합니다.

위치인자와 키워드인자 모두 가변인자로 사용가능합니다. 코드에서 많이 보는 *args, **kwargs 형태가 가변인자를 선언한 것입니다.

def refresh_connection(conn, *args, **kwargs):
conn.close()
return make_connection(*args, **kwargs)

가변 위치인자(*args)는 임의개수의 위치인자를 tuple형태의 변수로 저장합니다.
가변 키워드인자(**kwargs)는 임의개수의 키워드인자를 dictionary형태로 저장합니다.

def func(*args, **kwargs):
return print(*args, **kwargs)

함수 선언의 *args는 위치 인자로 들어온 값을 tuple타입으로 packing합니다.
함수 호출의 *args는 tuple타입의 변수를 unpacking하여 줍니다.

위의 예제처럼 함수의 선언과 내부 호출에 모두 starred-expression이 있으면 입력받은 가변인자들을 그대로 똑같이 전달한다고 생각하면 좋습니다.

>>> def func(*args, **kwargs):
... print(args[0])
... print(args[1])
... print(kwargs['x'])
>>> func(1, x='x')
args 0 index 1
kwargs 'x' element x

호출시 1개의 위치인자와 1개의 키워드 인자로 전달하고 가변인자들은
각각을 저장하여 사용합니다.

>>> func(1, 2, 3, x='x', y='y', z='z')
args 0 index 1
kwargs 'x' element x

각각 3개의 위치, 키워드 인자를 사용하였고 위와 결과는 동일합니다.

>>> func(*(1,2,3), **{'x':'x', 'y':'y', 'z':'z'})
args 0 index 1
kwargs 'x' element x

함수 호출시 1개의 튜플을 언패킹하여 3개의 위치인자를, 1개의 dictionary를 언패킹하여 3개의 키워드인자를 입력값으로 사용하였습니다.

쉽지만 가끔씩 헷갈리던 가변인자와 패킹/언패킹에 대해서 이해하는데 도움이 되었으면 좋겠습니다

참고링크

Blog https://chrisjune.dev Work for www.29cm.co.kr