packing과 unpacking의 개념을 알아보기 전에 가변 매개변수에 대해 간단히 이해를 하고 넘어가는 게 좋다.
[Python] 가변 매개변수와 키워드 가변 매개변수
argument packing & unpacking
packing은 인자로 받은 여러 개의 값(객체)을 하나의 객체로 합친다.
unpacking은 packing과는 반대로 여러 값을 갖고 있는 한 객체를 풀어, 여러 객체로 나누어준다.
packing
가변 매개변수는 tuple 타입으로 packing 되어 있고,
키워드 가변 매개변수는 dict 타입으로 packing 되어 있다.
args에 들어간 인수들은 tuple 형태로 출력되고,
kwargs에 들어간 인수들은 dict 형태로 출력되는 걸 볼 수 있다.
args 매개변수의 타입이 tuple인 것을 확인할 수 있다.
위 예시에서는 10, 20, 30이 함수의 인수 값으로 들어갔는데,
이때의 값들은 모두 packing 되어 전달되는 것이다.
정리해보자면 함수 정의 시 가변 매개변수 앞에 *을 붙여,
함수를 호출할 때 인수로 넣은 값을 packing 하여 함수의 매개변수로 전달한다.
키워드 가변 매개변수의 경우는 **을 붙인다.
unpacking
packing은 함수를 정의할 때 매개변수 앞에 *을 붙여서 발생시킬 수 있다.
unpacking은 함수를 호출할 때 인수 앞에 *을 붙여서 발생시킬 수 있다.
키워드 가변 매개변수는 **을 붙인다.
unpacking의 예는 아래와 같다.
앞서 본 여러 개의 인자 값을 받을 수 있는 함수와는 다르게 세 개의 인자를 받는 함수가 정의되어 있다.
10, 20, 30을 각각 따로 인수로 주어도 동작하고,
tuple 데이터인 data를 만들어 data의 0번째 값, 1번째 값, 2번째 값을 각각 따로 넣어도 잘 동작한다.
그런데 어차피 data에는 3개의 값만 저장되었으니 data를 통째로 함수의 인수로 넣고 싶다.
data 변수에 저장된 값은 tuple임에도 불구하고 TypeError가 발생한다.
이는 unpacking이 되지 않아서 add_three_numbers 함수의 매개변수 a에만 data가 들어가서 그런 것이다.
따라서 *을 붙여 unpacking을 해주어야한다.
data내에 있는 3개의 값(100, 200, 300)이
각각의 객체로 나누어져(unpacking) 함수의 인수로 들어가 잘 실행되었다.