[Python] *args와 **kwargs 사용방법
Python에서 *args, **kwars를 사용하는 함수를 볼 때가 있습니다. C를 접하신분은 * 를 보고 Python에도 포인터가 있다고 오해할 수도 있지만 다행히도 포인터는 아닙니다. 분명 arguments를 받는 인자인 것 같은데, Python 입문자들을 혼동스럽게 만드는 *args와 **kwars에 대해서 알아보겠습니다. (작성 하실 때 *args와 **kwars 라는 이름을 사용할 필요는 없습니다. args와 kwars는 변수명이기때문에 다른 변수명 앞에 * 또는 **를 붙여 사용하면 됩니다. 예를들어 *vars나 **arguments 등으로 바꾸어 사용하시면 됩니다.)
간단히 argument를 입력받아 print하는 예를 들겠습니다.
def print_args(arg1, arg2):
print('arg1: [ {} ]'.format(arg1))
print('arg2: [ {} ]'.format(arg2))
위 Function은 2개의 인자를 받아 print합니다.
print_args('apple', 'banana')
Output:
arg1: [ apple ]
arg2: [ banana ]
2개를 입력받아 print하는 경우에는 문제가 없지만 3개의 인자를 받으려면, 함수를 수정해야 하거나 인자 개수가 다른 함수를 추가로 만들어야 합니다.
def print_3_args(arg1, arg2, arg3):
...
def print_4_args(arg1, arg2, arg3, arg4):
...
1. *args 사용법
키워드 되지않은 가변적인 갯수의 인자들을 함수에서 필요로 할 때 사용합니다. 좀 더 간단히 말하자면 함수의 인자를 몇 개 받을 지 모르는 경우에 사용하면 매우 유용합니다. *args는 인자를 tuple로 전달합니다.
만약 정해지지 않은 n개의 인자를 받고 싶을 때, 다음과 같이 *args를 사용할 수 있습니다.
def print_args(*args):
for idx, arg in enumerate(args):
print('arg{}: [ {} ]'.format(idx+1, arg))
print_args('apple', 'banana', 'carrot', 'dragon frut')
Output:
arg1: [ apple ]
arg2: [ banana ]
arg3: [ carrot ]
arg4: [ dragon frut ]
def print_args(*args):
print('input args : {}'.format(args))
print('args type : {}\n'.format(type(args)))
Output:
input args : ('apple', 'banana', 'carrot', 'dragon frut')
args type : <class 'tuple'>
*args는 인자를 tuple로 전달합니다.
2. **kwargs 사용법
키워드된 가변적인 갯수의 인자들을 함수에서 필요로 할 때 사용합니다. kwargs(keyword arguments) 명칭에서도 알 수 있듯이 *args와 **kwargs의 차이는 keyword, nonkeyword 차이입니다. **kwargs는함수에서 여러개의 인자 n개를, key-value 형태로 받을 때 사용하며 인자를 dictionary로 전달합니다.
def print_kwargs(**kwargs):
print('input kwargs : {}\n'.format(kwargs))
print('first_name:', kwargs['first_name'])
print('last_name:', kwargs['last_name'])
print_kwargs(first_name='yunwoong', last_name='kim')
Output:
input kwargs : {'first_name': 'yunwoong', 'last_name': 'kim'}
first_name: yunwoong
last_name: kim
입력되는 keyword를 이용하여 분기 로직을 구현할 수 도 있습니다.
def print_kwargs(**kwargs):
print('first_name:', kwargs['first_name'])
if 'last_name' in list(kwargs.keys()):
print('last_name:', kwargs['last_name'])
print_kwargs(first_name='yunwoong', last_name='kim')
Output:
first_name: yunwoong
last_name: kim
3. *args와 **kwargs 같이 사용하는 방법
아래 코드는 *args와 **kwargs를 함께 사용하는 예제입니다. *args, **kwargs, 형식 인자(format args) 3가지를 동시에 사용 가능하며 사용순서는 format args, *args, **kwargs 순입니다.
def print_args_kwargs(farg, *args, **kwargs):
print(farg)
for arg in args:
print(arg)
for key, value in kwargs.items():
print('key = {}, value = {}'.format(key, value))
print_args_kwargs('farg', 'arg1', 'arg2', 'arg3', kwarg1 ='Hello', kwarg2 ='World', kwarg3='Python')
Output:
farg
arg1
arg2
arg3
key = kwarg1, value = Hello
key = kwarg2, value = World
key = kwarg3, value = Python