django에서 *args, **kwargs

Django와 같은 Python 기반 프레임워크에서 *args**kwargs는 함수나 메소드에 임의의 개수의 인자를 전달하는데 사용되는 문법입니다.

  1. *args: *args는 임의의 개수의 위치 인자를 함수나 메소드로 전달하는데 사용됩니다. 이를 통해 함수나 메소드는 미리 정해지지 않은 개수의 인자를 받을 수 있습니다. *args는 튜플 형태로 인자를 전달받습니다.
  2. **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