데코레이터의 장점은 중복을 제거하고 코드를 간결하게 하며 공통된 함수(로깅, 프레임워크, 유효성 체크)를 작성할 수 있게 한다. 단점이라면 가독성이 악화되고 디버깅이 어려워지기는 하지만 같은 함수를 반복적으로 불러와야 할 때 매우 효율적인 방법이다.

이하는 인프런의 파이썬 중급 오리지널에 나오는 코드를 살짝 수정한 것이다.

우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original) - 인프런 | 강의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import time

def perfomance(function):
#클로저 형식 진입
  def perfomance\_2(\*args):
    st = time.perf\_counter()
    result = function(\*args)
    et = time.perf\_counter() - st
    name = function.\_\_name\_\_
    arg\_str = ", ".join(repr(arg) for arg in args)
    #결과
    print("[%0.5fs %s(%s) -> %r" % (et, name, arg\_str, result))
    return result
  return perfomance\_2 #클로저 마무리

데코레이터는 보다시피 클로저와 일급함수의 기능을 사용하므로 이를 사용하기 위해선 일급함수와 클로저에 대한 선행학습이 되어 있어야 한다.

```python @perfomance def time_func(seconds): time.sleep(seconds)

@perfomance def sum_func(*numbers): return sum(numbers)

데코레이터의 호출 방법은 간단하다. 함수 바로 윗줄에 @(골뱅이) 이후 사용할 일급 함수의 이름을 적는다. 그게 전부다.

time_func(2) sum_func(1, 2, 3)

그리고 마지막으로 함수를 호출한다. 1번째 함수는 우리가 넣은 수의 시간만큼 잠을 자는, 그러니까 대기하는 함수. 두 번째 함수는 우리가 넣은 수를 더하는 함수다.

결과:

2.00489s time_func(2) -> None 0.00000s sum_func(1, 2, 3) -> 6

1번째 함수는 아무것도 반환하지 않으며, 2초간 쉬었지만 0.00489초가 더 걸렸다. 2번째 함수에서는 1 + 2 + 3인 6을 반환했는데, 0.00000초도 되지 않는 짧은 시간 내에 모든 계산을 완료했다. 우리가 원하는 시간대에 원하는 데코레이터를 넣으면 사용자 데이터(통계) 또는 런타임 값 등을 유용하게 알아낼 수 있다.