반응형
데코레이터의 기본 개념
데코레이터는 다른 함수를 인자로 받아, 새로운 함수를 반환하는 함수입니다. 즉, 데코레이터를 사용하면 기존 함수의 기능을 바꾸거나 확장할 수 있습니다.
형태:
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)) # 캐싱을 통해 속도 개선
반응형