Packing Arguments

다른 사람의 코드를 보다보면 종종 보이는 *args**kwargs가 있었다.

대강 어떤 것인지 느낌은 알고 있었지만 정확히 어떻게 동작을 하는지 몰라서 찾아봤다.

*args

보통 어떤 함수의 인자로 몇개가 들어올지 모를 때 사용된다.

함수 내부에서는 tuple type으로 동작하게 된다.

def func(*args):
    print type(args)
    print args

func(1,2,3)
# type<'tuple'>
# (1,2,3)

또한 함수를 호출할 때도 *를 사용해 list나 tuple을 넣을 수 있다.

list_data = ['a','b','c']

tuple_data = ('d','e','f')

func(*list_data)
# type<'tuple'>
# ('a','b','c')

func(*tuple_data)
# type<'tupel'>
# ('d','e','f')

인자로 list를 넣어도 함수 내부에서는 tupel로 동작하는 것을 확인할 수 있다.

**kwargs

*args와 비슷하지만 이름이 있는 인자로 사용된다.

함수 내부에서는 dict type으로 동작하게 된다.

def func2(**kwargs):
    print type(kwargs)
    print kwargs

func2(a=1,b=2,c=3)
<type 'dict'>
{'a': 1, 'c': 3, 'b': 2}

**를 사용해 함수를 호출할 때 dictionary를 넣을 수 있다.

dict_data = {'a':4, 'b':5, 'c':6}

func2(**dict_data)
<type 'dict'>
{'a': 4, 'c': 6, 'b': 5}

추가로

보통 *args, **kwargs를 사용할 때 네이밍을 이대로 쓴다.

물론 *tuple_datas, **dict_datas 이런식으로 다르게 사용이 가능하지만코드를 읽을 때 혼란을 줄 수 있으므로 위의 네이밍을 그대로 사용하자.