본문 바로가기
파이썬/자주하는 질문

파이썬(Python) *args **kwargs 는 무엇일까?

by J-Build 2020. 9. 12.

파이썬 코드에서 함수의 파라미터로 *args 또는 **kwargs 를 보는 경우가 있습니다. 기본적으로, *(별표, asterisk)는 여러개의 인자들(positional arguments)을 받겠다는 의미를 포함합니다.

 

먼저, *args를 살펴볼께요. 아래 예제에서는 foo() 함수에서 *args를 사용하여 인자들을 튜플(tuple)로 받을 수 있게 해줍니다. 즉 args의 타입은 튜플이 되겠죠. 그리고 갯수에 상관없이 얼마든지 인자로 값들을 넘겨줄 수 있습니다. 

def foo(*args):
    for a in args:
        print(a)

foo(1, 2)
# 1
# 2

foo(1, 2, 3)
# 1
# 2
# 3

 

그럼 **kwargs는 어떨까요? *args와 유사하지만 튜플이 아닌 딕셔너리(dict) 타입으로 인자들을 받아오게 해주는 키워드입니다. 당연히 넘겨주는 인자의 갯수에는 제한이 없습니다. (참고로 kwargs에서 kw는 keyword를 의미합니다)

def bar(**kwargs):
    for a in kwargs:
        print(a, kwargs[a])  

bar(first_name='J Builder', last_name='Awesome')
# first_name J Builder
# last_name Awesome

 

*args와 **kwargs는 상황에 맞게 같이 사용될 수 도 있습니다. 아래와 같이 함수의 파라이터(parameter)를 설정한다면 함수 호출 시 자연스럽게 인자들이 파라미터에 할당이 되게 됩니다. 단, 가능하다면, **kwargs는 *args 보다 뒤쪽에 와야합니다. 

def foobar(grade, *args, **kwargs):
    print(f'grade: {grade}')
    
    for a in args:
        print(a)
    
    for k, v in kwargs.items():
        print(k, v)

foobar(1, 2, 3, first_name='J Builder', last_name='Awesome')
# grade: 1
# 2
# 3
# first_name J Builder
# last_name Awesome

 

* 기호의 또 다른 사용방법을 알아보겠습니다.

함수 호출시 * 또는 ** 기호를 사용해서 인자를 넘겨 줄 수도 있습니다. 

먼저 별표 한개(*)를 사용하는 경우입니다. 

def foo(a, b, c):
    print(a, b, c)

params = [1, 2, 3]	# (1, 2, 3)과 같은 튜플(tuple) 타입도 동일한 결과를 만들어 냅니다. 
foo(*params)	# 함수 호출 시 자동으로 각 파라미터에 params의 값들이 할당 됩니다. 
# 1 2 3

params = [1, 2, 3, 4]	# 만약 함수의 파라미터 갯수보다 많이 인자를 넘겨주면 TypeError가 발생합니다. 
foo(*params)
# TypeError

params = [1, 2]	# 만약 함수의 파라미터 갯수보다 적게 넘겨주어도 TypeError가 발생합니다. 
foo(*params)
# TypeError

 

이번엔 별표 두개(**)를 사용하는 방법을 알아볼께요.

별표 두개(**) 역시 **kwargs 때와 마찬가지로 딕셔너리(dict) 타입으로 인자를 넘어갑니다. 이 딕셔너리의 키(key)는 함수의 파라미터 이름이 되고 값(value)은 할당되는 값이 되게 됩니다. 아래 예제로 살펴볼께요. 

def foo(a, b, c):
    print(a, b, c)

params = {'b':'J', 'c':'Builder'}
foo('Awesome', **params)
# Awesome J Builder

params = {'b':'J'}	# 인자의 갯수가 함수에서 정의한 파라미터 갯수와 같지 않다면 TypeError를 방생합니다. 
foo('Awesome', **params)
# TypeError

params = {'v':'J', 'w':'Builder'}	# 키(key)가 함수에서 정의한 파라미터의 이름과 달라도 TypeError가 발생됩니다.
foo('Awesome', **params)
# TypeError

 

 

댓글