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
'Python' 카테고리의 다른 글
[Python] DFS에서 리스트 접근 방법 (0) | 2023.10.23 |
---|---|
[Python] Python에는 왜 long이 없을까? (0) | 2022.10.18 |
[Python] 딕셔너리의 키와 기본 값을 저장하기 (0) | 2022.03.24 |
[Python] 문자열 리스트를 정수 리스트로 변환 (0) | 2022.03.24 |
[Python] 두 딕셔너리의 합 구하기 (0) | 2022.02.08 |