Programing Language/Python

Python 데코레이터(Decorator)

칼쵸쵸 2024. 11. 27. 23:54
반응형

데코레이터의 기본 개념

데코레이터는 다른 함수를 인자로 받아, 새로운 함수를 반환하는 함수입니다. 즉, 데코레이터를 사용하면 기존 함수의 기능을 바꾸거나 확장할 수 있습니다.

 

형태:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 추가 동작
        print(f"{original_function.__name__} 함수가 호출되었습니다.")
        result = original_function(*args, **kwargs)
        # 추가 동작
        print(f"{original_function.__name__} 함수가 종료되었습니다.")
        return result
    return wrapper_function

 

사용 방법:

@decorator_function
def say_hello():
    print("Hello!")

say_hello()

 

위의 @decorator_function은 say_hello = decorator_function(say_hello)와 동일한 역할을 합니다.

데코레이터의 주요 사용 사례

1. 로깅(logging)

함수의 동작 전후를 로깅하는 데 사용됩니다.

def logger(func):
    def wrapper(*args, **kwargs):
        print(f"{func.__name__} 함수 시작")
        result = func(*args, **kwargs)
        print(f"{func.__name__} 함수 끝")
        return result
    return wrapper

@logger
def add(a, b):
    return a + b

print(add(2, 3))

 

2. 권한 검사(authentication)

사용자가 올바른 권한을 가지고 있는지 확인하는 기능에 유용합니다.

def check_permissions(func):
    def wrapper(user, *args, **kwargs):
        if user != "admin":
            print("권한이 없습니다.")
            return None
        return func(*args, **kwargs)
    return wrapper

@check_permissions
def delete_data():
    print("데이터 삭제 완료!")

delete_data("guest")  # 권한 없음 출력
delete_data("admin")  # 데이터 삭제 완료!

 

3. 입력값 검증(validation)

함수에 전달되는 인자의 유효성을 확인합니다.

def validate_positive(func):
    def wrapper(x):
        if x < 0:
            raise ValueError("양수만 입력하세요!")
        return func(x)
    return wrapper

@validate_positive
def calculate_square_root(x):
    return x ** 0.5

print(calculate_square_root(9))  # 3.0 출력
print(calculate_square_root(-1))  # ValueError 발생

 

4. 캐싱(caching)

결과를 저장하여 동일한 입력에 대해 다시 계산하지 않도록 최적화합니다.

def cache(func):
    memo = {}
    def wrapper(n):
        if n not in memo:
            memo[n] = func(n)
        return memo[n]
    return wrapper

@cache
def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 캐싱을 통해 속도 개선
반응형