파이썬 | functools.wraps

2022. 10. 3. 18:34·Python
반응형

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()를 데코레이터에 사용하면 이런 문제점들이 없어진다. 그래서 협업할 때 사용하는것이 좋은것 같은데, 사실 프로젝트때도 굳이 없어도 되는 기능이었고 그래서 지금도 완벽히 이해가 안가지만 언젠가 이해할수 있길.............

 

참고

https://velog.io/@doondoony/python-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
'Python' 카테고리의 다른 글
  • 파이썬 자료구조
  • mutable(변경 가능)과 immutable(변경 불가능)
  • 파이썬 | Type Hints, 타입 지정하기
  • 파이썬 | max, sorted,...의 key사용
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
파이썬 | functools.wraps
상단으로

티스토리툴바