- 클로저 → 데코레이터 관계
- 데코레이터 실습(1)
- 데코레이터 실습(2)
데코레이트
장점
- 중복 제거, 코드 간결, 공통 함수 작성
- 로깅, 프레임워크 유효성 체크 → 공통 기능
- 조합해서 사용하기 용이하다
단점
- 가독성이 감소.. ?
- 특정 기능에 한정된 함수는 → 단일 함수로 작성하는 것이 유리할 수도 있다.
- 디버깅 불편합니다.
데코레이터 미사용 (클로저로 사용해보기)
# 데코레이터
import time
# 클로저 형태로 사용함..
def performance_clock(func):
def perf_clocked(*args):
# 함수 시작 시간
st = time.perf_counter()
# 함수 실행
result = func(*args)
# 함수 종료 시간
et = time.perf_counter() - st
# 실행 함수 명
name = func.__name__
# 함수 매개변수
arg_str = ', '.join(repr(arg) for arg in args)
print('[%0.5fs] %s(%s) -> %r' % (et, name, arg_str, result))
return result
return perf_clocked
def time_func(seconds):
time.sleep(seconds)
def sum_func(*numbers):
return sum(numbers)
# 데코레이터를 미사용
none_deco1 = performance_clock(time_func)
none_deco2 = performance_clock(sum_func)
print(none_deco1, none_deco1.__code__.co_freevars)
print(none_deco2, none_deco2.__code__.co_freevars)
print('-' * 40, 'Called None Decorator -> time_func')
none_deco1(1.5)
print('-' * 40, 'Called None Decorator -> time_func')
none_deco2(100, 200, 300, 400, 500)
데코레이터 사용
@performance_clock
def time_func2(seconds):
time.sleep(seconds)
@performance_clock
def sum_func2(*numbers):
return sum(numbers)
none_deco3 = performance_clock(time_func2)
none_deco4 = performance_clock(sum_func2)
print('-' * 40, 'Called Decorator -> time_func')
none_deco3(1.5)
print('-' * 40, 'Called Decorator -> sum_func')
none_deco4(100, 200, 300, 400, 500)