[Python]데코레이터(Decorator)

파이썬의 데코레이터(Decorator)에 대해 알아보자

자바의 어노테이션(Annotation)과 형태가 같지만, 동작은 AOP와 유사하다.

# 데코레이터(Decorator) 실습
import time


def get_execute_time(func):
    def check_execute_time(*args):
        # 함수 시작 시각
        start_time = time.perf_counter()
        # 함수실행
        result = func(*args)
        # 함수 종료시각
        end_time = time.perf_counter() - start_time
        # 실행 함수명
        name = func.__name__
        # 함수 매개변수
        arg_str = ', '.join(repr(arg) for arg in args)
        print('[%0.05fs] %s(%s) -> %r' % (end_time, name, arg_str, result))
        return result

    return check_execute_time

# 데코레이터 미사용
def my_func1(n):
    for i in range(n):
        time.sleep(0.1)
    return 'completed!!'


def my_func2(*numbers):
    return sum(numbers)

ex1 = get_execute_time(my_func1)
ex2 = get_execute_time(my_func2)

print(ex1, ex1.__code__.co_freevars)
print(ex2, ex2.__code__.co_freevars)
print('-' * 40)
print(ex1(10))
print()
print(ex2(1, 2, 3, 4, 5))
'''
<function get_execute_time.<locals>.check_execute_time at 0x0000024F2BD345E0> ('func',)
<function get_execute_time.<locals>.check_execute_time at 0x0000024F2C04F760> ('func',)
----------------------------------------
[1.05514s] my_func1(10) -> 'completed!!'
completed!!

[0.00000s] my_func2(1, 2, 3, 4, 5) -> 15
15
'''


## 데코레이터 사용
@get_execute_time
def my_func3(n):
    for i in range(n):
        time.sleep(0.1)
    return 'completed!!'


@get_execute_time
def my_func4(*numbers):
    return sum(numbers)


print('-' * 40)
print(my_func3(10))
print()
print(my_func4(1, 2, 3, 4))
'''
----------------------------------------
[1.05755s] my_func3(10) -> 'completed!!'
completed!!

[0.00000s] my_func4(1, 2, 3, 4) -> 10
10
'''

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다