1차프로젝트때 로그인 데코레이터에 붙어있던 @wraps
# core/utils.py
def accessCkeck(func):
def wrapper(self, request, *args, **kwargs):
...
return func(self, request, *args, **kwargs)
return wrapper
# carts/views.py
...
class CartView(View):
@accessCkeck
def post(self, request):
"""carts에 post요청이 오면 카트생성""" # docstring추가
...
나도 2차때 써봤는데 정확히 무슨 역할을 하는건지 알아보지 않고
참고링크 글에서 다른 개발자와 협업할때 데코레이터를 만들거라면 사용하는게 좋다!는 말만 보고 사용했었다.
그래서 이번기회에 다시 알아봤다..
@wraps가 없을때
CartView의 post함수를 가지고 쉘에서 실험을 해봤는데
accessCkeck함수의 wrapper에서 @wraps데코레이터를 떼고 CartView.post함수를 찍어보면
>>> from carts.views import CartView
>>> CartView.post
<function accessCkeck.<locals>.wrapper at 0x10515a320>
>>> CartView.post.__doc__ # .__doc__은 함수의 docstring을 보여준다.
이렇게 CartView.post가 아닌 accessCkeck.<locals>.wrapper함수라고 나온다.
그리고 post함수의 docstring도 읽지 못한다. (당연한건가 CartView.post에 달려있는걸 읽어야하는데 CartView.post자체를 못읽으니까?)
@wraps가 있을때
다시 accessCkeck의 @wraps를 살리고 post함수와 독스트링을 찍어보면
>>> from carts.views import CartView
>>> CartView.post
<function CartView.post at 0x10729e3b0>
>>> CartView.post.__doc__
'carts에 post요청이 오면 카트생성'
이렇게 CartView.post로 잘 나오는 것을 볼 수 있다.
결론
아직 완전히 이해한 것은 아니지만!
데코레이터를 사용하면 데코레이터가 붙어있는 함수는 내부적으로 데코레이터의 wrapper로 인식되고 원래 어떤 함수인지는 알아볼수 없게 되는것 같다. 그래서 해당 함수에 달린 docstring을 읽을 수도 없게 되는것 같다.
*docstring: class, module, function, method의 첫 줄에 위치한, 개발된 기능을 사용하거나 개발에 기여하는 다른 개발자들의 이해를 돕기 위해 작성되는 주석
하지만 functools.wraps()를 데코레이터에 사용하면 이런 문제점들이 없어진다. 그래서 협업할 때 사용하는것이 좋은것 같은데, 사실 프로젝트때도 굳이 없어도 되는 기능이었고 그래서 지금도 완벽히 이해가 안가지만 언젠가 이해할수 있길.............
참고
'Python' 카테고리의 다른 글
| 파이썬 자료구조 (2) | 2024.10.08 |
|---|---|
| mutable(변경 가능)과 immutable(변경 불가능) (0) | 2024.10.02 |
| 파이썬 | Type Hints, 타입 지정하기 (0) | 2022.09.24 |
| 파이썬 | max, sorted,...의 key사용 (0) | 2022.07.14 |
| 파이썬 | for 요소 in 리스트 (0) | 2022.07.14 |