Python

[Python] *args 와 **kwargs 란?

torimuk 2022. 6. 27. 11:49

Problem


함수 인자로 *args를 사용하는 것과 **kwargs 를 사용하는 것은 각각 무엇을 의미하는 것일까?

 

 

Solution


*args와 **kwargs는 무엇을 의미할까?

*args와 **kwagrs는 가변인자를 핸들링하기 위해 사용된다.

파이썬은 JAVA, C++ 등 다른 언어에서 지원하는 형식의 함수 오버로딩을 지원하지 않는다.

def add(a):
	return a

def add(a, b):
	return a+b

def add(a, b, c):
	return a+b+c
    
# error!

대신 다른 방법으로 오버로딩을 구현할 수 있는데, 그 방법 중 한 가지가 바로 *args와 **kwargs를 사용하는 것이다.

*과 **뒤에는 원하는 이름을 사용할 수 있다. 가령 *parameter, **list 로 사용해도 무관하다는 것이다.

 

이 둘은 인자를 전송하는 형태에 따라 구분된다.

*args의 경우 함수의 인자를 튜플 형태로 저장한다.

def add(*args):
	if len(args) == 1:
		print(args[0])
    elif len(args) == 2:
    	print(args[0] + args[1])
    else:
    	print(args)

add(1, 2)
add(1, 2, 3)

##출력##
3
(1, 2, 3)

따라서 인덱스를 통해 접근할 수 있다.

 

**kwargs는 함수의 인자를 딕셔너리 형태로 저장한다. 따라서 함수의 인자에 파라미터 명을 같이 보낼 수 있다.

def add(**kwargs):
	for item in kwargs.items():
    	print(item)

add(name='홍길동', x=100, y=200)

##출력##
('name', '홍길동')
('x', 100)
('y', 200)

 

따라서 키를 통해 접근할 수 있다.

Django 의 CBV(Class Based View)에서도 **kwargs를 통해 URL Parameter를 가져온다.

# url = user/{user_id}
# request = user/user01

# view.py

class UserView(APIView):
	def get(self, *args, **kwargs):
    	user_id = self.kwargs['user_id']
        print(user_id)
        

## 출력 ##
user01