Python/Utils

[Python Utils] Python Decorator 활용

yubi5050 2022. 8. 25. 17:28

Python Decorator란?

파이썬 데코레이터란 함수를 수정하지 않고 추가 적인 기능을 더하고 싶을 때 주로 사용

 

아래 예제 코드를 수행하면 함수 호출 전이나 후에 기능이 동작하게 할 수 있다.

def trace(func):                             # 호출할 함수를 매개변수로 받음
    def wrapper():
        print(func.__name__, '함수 시작')    # __name__으로 함수 이름 출력
        func()                               # 매개변수로 받은 함수를 호출
        print(func.__name__, '함수 끝')
    return wrapper                           # wrapper 함수 반환
 
@trace    # @데코레이터
def hello():
    print('hello')
 
hello()    # 함수를 그대로 호출

##출력 결과
hello 함수 시작
hello
hello 함수 끝

 

Django의 Query를 Profiling 하기 위해선 아래와 같은 예시도 가능하다.

from django.db import connection, reset_queries
import time
import functools

def query_debugger(func):
    @functools.wraps(func)
    def inner_func(*args, **kwargs):
        reset_queries()

        start_queries = len(connection.queries)

        start = time.perf_counter()
        result = func(*args, **kwargs)
        end = time.perf_counter()
        
        end_queries = len(connection.queries)
        print(f"------------------------------------------------------")
        print(f"Function : {func.__name__}")
        print(f"Number of Queries : {end_queries - start_queries}")
        print(f"Finished in : {(end - start):.6f}s")
        print(f"------------------------------------------------------")
        return result

    return inner_func