[PYTHON] 함수 데코레이터 활용 실습

2023. 9. 20. 18:37DATA PROGRAMMING/PYTHON

데코레이터(decorator)는 함수를 수정하지 않고 함수의 작동 방식에 변화를 주거나 특정 동작을 추가하는 역할을 한다. 기존 함수를 입력받아 이를 통해 새로운 함수 객체를 만들어 준다.

 

파이썬 함수 데코레이터

 

def decorate(func): 
    def wrapper():
        print("함수 시작") 
        func()
        print("함수 끝") 
    return wrapper
    
def hello(): 
    print("hello")
    
say_hi = decorate(hello) 
say_hi()

위 코드를 사용하면, hello()함수를 decorate() 함수의 인자로 대입할 수 있다.

 

 

이를 @decorate 기능을 통해 더 쉽게 실행할 수 있다.

def decorate(func): 
    def wrapper():
        print("함수 시작") 
        func()
        print("함수 끝") 
    return wrapper

@decorate 
def hello():
    print("hello") 
    
hello()

decorate를 통해 hello()함수는 자동으로 decorate함수에 들어가고, hello()를 실행하면 아까와 같은 결과가 출력된다.

decorator는 마치 수학의 합성함수와 유사한 역할을 한다. 데코레이트 뒤에 정의된 함수를 데코레이트 전에 정의된 함수에 합성시키는 느낌이다.

 

 

 

우선 위 코드를 이해해보자. time.time() 함수는 현재 시스템 시간을 부르는 함수이다. 이를 start에 저장한다. 그리고 for 문을 활용하여 50개의 숫자를 출력한다. 마지막엔 다시 time.time()함수를 쓰고 start를 빼준다. 즉 마지막에 출력되는 값은 for문이 끝난 시점의 시스템 시각에서 for문 시작전에 실행한 시스템 시각을 빼주는 것이므로, for문의 작동 시간을 구하는 의미를 갖는다.

 

import time


def get_time(func):
    def wrapper(*args, **kwargs):
        # code here
        start = time.time()
        func()
        return time.time() - start
        #
    return wrapper


@get_time
def for_loop(r=100000):
    for i in range(r):
        if i % 10000 == 0:
            print(i)
    return None


print(for_loop())

get_time이후 정의된 함수는 자동으로 get_time함수에 저장된다. 즉 for_loop함수의 실행시간이 얼마나 되는지 출력해 준다.