[파이썬] 데코레이터와 함수 메타데이터

Python에서 데코레이터는 많은 기능을 제공하며 코드의 재사용성과 유지보수성을 향상시키는 데에 도움이 됩니다. 데코레이터를 사용하면 함수에 추가적인 동작을 할당할 수 있습니다. 이러한 동작은 함수를 실행하기 전이나 후에 수행되며, 함수에 메타데이터를 추가하는데 사용할 수도 있습니다.

데코레이터란?

데코레이터는 다른 함수를 인자로 받아서 그 함수에 새로운 기능을 추가하는 함수입니다. 이를 통해 코드의 중복을 줄이고, 특정 동작을 여러 함수에 적용할 수 있게 됩니다. 데코레이터의 가장 일반적인 예로는 함수의 실행 시간을 측정하는 데코레이터가 있습니다.

import time

def measure_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"함수 {func.__name__}의 실행 시간: {end_time - start_time}초")
        return result
    return wrapper

위의 예시에서 measure_time 데코레이터는 입력된 함수를 감싸고, 그 함수의 실행 시간을 측정하여 출력합니다. 이렇게 측정된 실행 시간은 해당 함수가 호출될 때마다 출력됩니다.

메타데이터 추가하기

데코레이터는 함수에 대한 메타데이터를 추가하는 데에도 사용될 수 있습니다. 이러한 메타데이터는 함수에 대한 정보를 담고 있으며, 예를 들어 함수의 이름, 설명, 사용법 등을 포함할 수 있습니다. 이러한 정보의 예시로 함수의 도움말 출력 기능을 생각해 볼 수 있습니다.

def add_metadata(name, description):
    def decorator(func):
        func.name = name
        func.description = description
        return func
    return decorator

위의 예시에서 add_metadata 데코레이터는 namedescription 파라미터를 사용하여 입력된 함수에 메타데이터를 추가합니다. 이렇게 메타데이터가 추가된 함수는 해당 정보를 활용하여 필요한 작업이나 문서화에 활용될 수 있습니다.

사용 예시

이제 데코레이터와 함수 메타데이터를 적용하는 예시를 살펴보겠습니다.

@measure_time
def calculate_power(base, exponent):
    result = base ** exponent
    return result

@add_metadata("calculate_power", "Calculate the power of a number")
def calculate_power(base, exponent):
    result = base ** exponent
    return result

위의 예시에서 첫 번째 함수 calculate_powermeasure_time 데코레이터를 사용하여 실행 시간을 측정하고 출력합니다. 두 번째 함수 calculate_poweradd_metadata 데코레이터를 사용하여 메타데이터를 추가합니다.

이처럼 measure_time 데코레이터를 사용하면 함수가 얼마나 빠르게 실행되는지 확인할 수 있습니다. 또한 add_metadata 데코레이터를 사용하면 함수의 정보를 정의하고 관리할 수 있습니다.

데코레이터와 함수 메타데이터를 사용하면 코드를 더욱 유연하고 재사용 가능하게 만들 수 있습니다. 심층적인 기능을 제공하기 때문에, 데코레이터는 Python 개발에서 활용될 수 있는 강력한 도구입니다.