파이썬은 함수에 적용할 수 있는 데코레이터를 정의하는 특별한 구문을 제공

예시) 함수가 호출될 때마다 인자 값과 반환 값을 출력하고 싶음

*args**kwargs 를 사용해 감싸진 함수의 모든 파라미터를 전달받음

def trace(func):
    def wrapper(*args, **kwargs): # 위치기반인자(스타인자), 모든 키워드 인자를 dict로 받음
        result = func(*args, **kwargs)
        print(f'{func.__name__}({args!r}, {kwargs!r}) '
              f'-> {result!r}')
        return result
    return wrapper

# 위 데코레이터 함수를 적용할 때는 @ 기호 사용함
@trace
def fibonacci(n):
    """n번째 피보니치 수를 반환한다"""
    if n in (0, 1):
        return n
    return (fibonacci(n - 2) + fibonacci(n - 1))