[Python] 일급함수- 장식자(데코레이터)

728x90

파이썬에서 장식자(Decorator)는 함수나 메서드를 수정하거나 기능을 추가하는 데 사용되는 강력한 기능입니다. 장식자는 함수의 앞이나 뒤에 @ 기호를 사용하여 정의되며, 주로 함수나 메서드를 간단하게 수정하거나 특정 기능을 추가하기 위해 사용됩니다.

 

파이썬에서는 기본적으로 많은 내장 장식자가 제공되며, 사용자가 직접 장식자를 정의하여 활용할 수도 있습니다. 

예를 들어, @staticmethod, @classmethod, @property, @abstractmethod와 같은 내장 장식자가 있습니다.

 

데코레이터를 작성하기 위해서는 아래 내용을 이해해야 합니다.
1. 클로저
2. 일급함수를 활용하는 방법
3. 가변인자
4. 인자풀기(언팩킹)
5. 파이썬이 소스코드를 불러오는 과정

 

데코레이터의 장단점은 아래와 같습니다.


장점
1. 중복제거, 코드간결, 공통함수 작성
2. 로깅, 프레임워크, 유효성 체크 -> 공통 기능
3. 조합해서 사용하기 편함

단점
1. 가독성 떨어짐
2. 특정 기능에 한정된 함수는 단일함수로 작성하는 것이 유리할수도 있음
3. 디버깅이 불편함

 

import time

def perform_time(func):
    def perform_cal(*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 perform_cal

 

위 예제를 함수 진행시간을 측정하는 클로저입니다.

 

이것을 데코레이터를 사용하지 않는다면 아래처럼 사용해야 합니다.

 

def test(v):
    time.sleep(v)

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

none_deco = perform_time(test)
none_deco2 = perform_time(sum_func)

print(none_deco,none_deco.__code__.co_freevars) #출력: <function perform_time.<locals>.perform_cal at 0x0000017C04E3F0D0> ('func',)
print(none_deco2,none_deco2.__code__.co_freevars) #출력: <function perform_time.<locals>.perform_cal at 0x0000017C04E3F940> ('func',)


none_deco(1.5) #출력: [1.50918s] test(1.5) -> None
none_deco2(100,300,500,400) # 출력: [0.00000s] sum_func(100, 300, 500, 400) -> 1300

 

데코레이터를 사용한다면 아래와 같습니다.

@perform_time
def test2(v):
    time.sleep(v)

@perform_time
def sum_func2(*numbers):
    return sum(numbers)

test2(1.5) #출력: [1.51264s] test2(1.5) -> None

sum_func2(100,300,500,400) # 출력: [0.00000s] sum_func2(100, 300, 500, 400) -> 1300