python @decorator 이해하기

eunji hwang·2020년 4월 3일
0

Decorater?

@is_paid_user
def get_infomation() : 
    ...

데코레이터는 장식/장식하는 사람을 말한다. 함수가 정의될때 @함수명(위 예제코드참고)과 같은 구문을 보았다면 그것이 바로 데코레이터다!

사용처

언제 데코레이터를 사용하게 될까? 데코레이터의 기능 먼저 알아야 겠다. 위 예제코드를 보며 이해해 보자! 데코레이터로 선언된 함수는 is_paid_user이고, 데코레이터를 사용할 함수는 아래 정의된 get_infomation함수다.

  • 데코레이터 : is_paid_user
  • 데코레이터+ 정의한 함수 : get_infomation

앞으로 get_infomation함수를 호출 할 때마다 데코레이터로 선언된 is_paid_user가 먼저 실행 될 것이다.

왜 먼저 실행되야 하는가?

get_infomation 함수는 유료회원에게만 정보를 알려주는 함수이다. 이 함수는 유료회원에게만이라는 조건이 붙었다. 그래서 항상 실행전 is_paid_user 함수를 먼저 실행해 해당 유저의 정보를 파악한다.

아 ! 이 회원은 돈을 냈군 ! 정보를 알려줘도 좋다!

하지만, 항상 두개의 함수를 동시에 쓴다는 것을 잊을 수 있으니! 본드로 붙여놓든 @decorator 해주는 것이다.

Syntax

@데코레이터기능함수명
def 함수명 () : 
    ...함수내용 정의하기
    return 중첩함수

중첩함수(nested function)

데코레이터의 기능을 다르게 설명하면 decorator = chain of functions
마지막 함수를 제외한 함수들은 다음함수를 리턴해 주어야, 다음 함수가 실행 될 수 있다.

아! 다음 함수를 리턴해야 하는 구나!
라고 생각을 해도 어떻게 연결해야 한다는 건지 이해가 가지 않는다. 예제코드를 보자. 예제코드를 봐도 잘 이해가지 않는다..? 아래 코드를 보자

# 데코레이터로 사용할 함수 선언
def is_paid_user(func) :
    user_paid = true # 예제코드니까..
    
    def wrapper() :
        if user_paid :
            func() # 함수 인자 실행
        else :
            return # ??
    return wrapper
    
    
# 데코레이터를 갖는 함수 선언
@is_paid_user
def get_infomation() :
   return '정보'
   
   
# 데코레이터를 갖는 함수 호출
get_infomation()
# 함수를 호출하게 되면 파이싼이 아래와 같은 코드로 변환하여 호출한다.
decorated_function = is_paid_user(get_infomation)
decorated_function() 

예제코드에서 최종적으로 실행될 때의 모습은 is_paid_user(get_infomation) 와 같다. 데코레이터를 실행할때 인자로 해당 함수를 전달하게 된다.

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글