functools.wraps

2cong·2020년 6월 11일
0

Today I Learned

목록 보기
17/22

https://velog.io/@doondoony/python-functools-wraps
https://cjh5414.github.io/wraps-with-decorator/ 의 내용을 보고 정리한 글

functools 의 wraps --> python decorator에 적용하는 함수

functools.wraps

사용방법

from functools import wraps

위와 같이 import해서 사용할 수 있음

위의 함수를 import하고 decorator위에 @wraps(func)라는 데코레이터를 하나 달아주면 됨

사용 이유

wraps를 사용하지 않고 decorator를 사용하는 경우
데코레이터가 원래의 함수를 감싸기 때문에 원래의 함수의 이름이 아닌 decorator의 이름을 식별자로 가지게 됨

따라서 flask의 경우에는 route를 실행할 때 다른 함수이지만 하나의 함수(decorator이름을 가진 함수)로 정의하게 되고 에러를 발생시킴

또한 디버깅하기 힘든 문제가 생김

이러한 것을 막기 위하여 functools.wraps를 사용

사용 예시

  1. 사용 전
 import jwt
 from flask import request, jsonify

 from my_settings import SERCRET, HASH_ALGORITHM


 def login_required(func):
     def wrapper(*args, **kwargs):

         try:
             token = request.headers['Authorization']
             decoded_token = jwt.decode(token, SERCRET, HASH_ALGORITHM)
  1. 사용 후
 import jwt
 from flask import request, jsonify
 from functools import wraps

 from my_settings import SERCRET, HASH_ALGORITHM


 def login_required(func):
     @wraps(func)
     def wrapper(*args, **kwargs):

         try:
             token = request.headers['Authorization']
             decoded_token = jwt.decode(token, SERCRET, HASH_ALGORITHM)

위의 사용 예시와 같이 간단하게 사용할 수 있음!

사용 효과

위의 wraps를 사용하게 되면 함수의 이름을 제대로 된 함수 이름으로 인식하여서 디버깅 등에 편의가 생김!

0개의 댓글