Django와 같은 Python 기반 프레임워크에서 *args
와 **kwargs
는 함수나 메소드에 임의의 개수의 인자를 전달하는데 사용되는 문법입니다.
*args
:*args
는 임의의 개수의 위치 인자를 함수나 메소드로 전달하는데 사용됩니다. 이를 통해 함수나 메소드는 미리 정해지지 않은 개수의 인자를 받을 수 있습니다.*args
는 튜플 형태로 인자를 전달받습니다.**kwargs
:**kwargs
는 임의의 개수의 키워드 인자를 함수나 메소드로 전달하는데 사용됩니다. 이를 통해 함수나 메소드는 미리 정해지지 않은 개수의 키워드 인자를 받을 수 있습니다.**kwargs\
는 딕셔너리 형태로 인자를 전달받습니다.
참고 위치인자, 키워드 인자란 : https://yesaroun.tistory.com/entry/Python-%EC%9C%84%EC%B9%98-%EC%9D%B8%EC%9E%90-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%9D%B8%EC%9E%90
일반적인 사용 예시
1. *args
의 사용 예시
def print_all_args(*args):
for count, thing in enumerate(args):
print('{}. {}'.format(count, thing))
print_all_args('apple', 'banana', 'cabbage')
# 0. apple
# 1. banana
# 2. cabbage
위의 코드는 print_all_args
라는 함수를 정의하고 있습니다. 이 함수는 *args
를 인자로 받아서, 넘겨받은 모든 인자를 출력합니다. 따라서 'apple', 'banana', 'cabbage' 세 가지 인자를 넘겨주면, 이 세 가지 모두를 출력합니다.
2. `kwargs`의 사용 예시**
def print_keyword_args(**kwargs):
for key in kwargs:
print('{}: {}'.format(key, kwargs[key]))
print_keyword_args(apple='fruit', cabbage='vegetable')
# apple: fruit
# cabbage: vegetable
위의 코드는 print_keyword_args
라는 함수를 정의하고 있습니다. 이 함수는 **kwargs
를 인자로 받아서, 넘겨받은 키워드 인자의 키와 값을 출력합니다. 따라서 'apple'과 'cabbage'라는 키와 각각의 값을 넘겨주면, 이 키와 값들을 출력합니다.
django에서 사용 예시
1. *args
의 사용 예시
장고에서 *args
와 **kwargs
는 주로 URLconf에서 보낸 위치 인자와 키워드 인자를 뷰 메소드로 전달하는데 사용됩니다.
먼저, URLconf를 정의합니다
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path("articles/<int:year>/", views.YearArchiveView.as_view())
]
위의 URL 패턴에서 <int:year>
부분은 year
라는 이름의 정수 변수를 캡처합니다.
이제 뷰에서 이 year
변수를 받아서 처리하는 코드를 작성합니다
# views.py
from django.http import HttpResponse
from django.views import View
class YearArchiveView(View):
def get(self, request, *args, **kwargs):
year = kwargs.get("year")
return HttpResponse("Year archive: {}".format(year))
위의 코드에서 *args
와 **kwargs
는 URLconf에서 캡처한 변수를 받는 역할을 합니다. 여기서 kwargs.get("year")
를 통해 year
변수를 가져오고 있습니다.
2. `kwargs`의 사용 예시**
장고(Django)에서 *args
를 사용하는 상황은 비교적 드뭅니다. 왜냐하면 대부분의 경우에서 키워드 인자(**kwargs
)가 더 명확하고 관리하기 쉽기 때문입니다. 키워드 인자를 사용하면 각 인자가 무엇을 의미하는지 명확히 알 수 있습니다.
그러나 *args
는 어떤 함수나 메소드를 오버라이드(override)하거나 래핑(wrapper)하는 경우에 유용하게 사용할 수 있습니다. 예를 들어, Django에서 모델의 save
메소드를 오버라이드하는 경우에 *args
를 사용할 수 있습니다
from django.db import models
class MyModel(models.Model):
my_field = models.CharField(max_length=100)
def save(self, *args, **kwargs):
self.my_field = self.my_field.upper() # 대문자로 변환
super().save(*args, **kwargs) # save() 메서드 오버라이드
여기서 *args
와 **kwargs
를 사용하면, 원래 save
메소드가 받아들일 수 있는 모든 인자를 그대로 전달할 수 있습니다. 따라서 *args
와 **kwargs
를 사용하면 원래의 save
메소드와 같은 인터페이스를 유지하면서 새로운 동작을 추가할 수 있습니다.
'Python > Django' 카테고리의 다른 글
values_list() (0) | 2023.08.09 |
---|---|
annotate() 메서드와 가변 키워드 인자 (0) | 2023.07.25 |
get_user_model() (0) | 2023.07.22 |
django 템플릿 <script>태그 (0) | 2023.07.08 |
Django ORM에서 던더(__) (0) | 2023.07.07 |