반응형

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
반응형