1. Python 데코레이터란 무엇인가?
Python 데코레이터는 함수나 메서드를 감싸서 동작을 수정하거나 확장할 수 있는 강력한 도구입니다. 데코레이터는 또 다른 함수를 반환하는 함수로, 주로 @ 표기법을 사용해 함수나 클래스에 적용됩니다.
주요 개념:
- 동작 확장: 기존 코드를 수정하지 않고 새로운 기능을 추가합니다.
- 재사용성: 중복된 로직을 데코레이터로 분리하여 여러 곳에서 재사용 가능합니다.
- 클린 코드: 로직을 분리하여 코드 가독성을 높입니다.
예제
def my_decorator(func): # 대상함수를 입력값으로 받음
def wrapper(*args): # 대상함수의 입력파라미터를 내부함수를 통해 받음
print("함수 호출 전 작업")
func(*args) # 대상함수 호출
print("함수 호출 후 작업")
return wrapper # 내부함수를 반환
@my_decorator # 데코레이터 적용
def say_hello(): # 대상함수
print("안녕하세요!")
say_hello()
#출력
#함수 호출 전 작업
#안녕하세요!
#함수 호출 후 작업
2. Python 데코레이터의 장점
- 코드 재사용성: 공통 로직을 별도 함수로 분리하여 중복 제거.
- 모듈화: 핵심 로직과 부가적인 로직을 분리.
- 가독성: 코드가 더 간결해지고 명확해짐.
- 유연성: 함수, 클래스, 메서드 등에 자유롭게 적용 가능.
3. Python 데코레이터의 단점
- 가독성 저하 가능성: 데코레이터의 동작을 이해하지 못하면, 코드 흐름 파악이 어려울 수 있음.
- 디버깅 어려움: 데코레이터 내부에서 발생한 오류는 원래 함수의 오류처럼 보이기 어려움.
- 추적성: 데코레이터가 여러 개 중첩될 경우 함수의 최종 동작을 추적하기 어려움.
4. 성능 측정을 위한 데코레이터 예제
아래는 함수의 실행 시간을 측정하는 데코레이터입니다.
import time
def timing_decorator(func):
def wrapper(*args, **kwargs):
start_time = time.perf_counter() # 시작 시간 기록
result = func(*args, **kwargs)
end_time = time.perf_counter() # 종료 시간 기록
print(f"{func.__name__} 실행 시간: {end_time - start_time:.4f}초")
return result
return wrapper
@timing_decorator
def example_function(n):
total = 0
for i in range(n):
total += i
return total
# 테스트
result = example_function(1_000_000)
print(f"결과: {result}")
#출력
#example_function 실행 시간: 0.0453초
#결과: 499999500000
- time.perf_counter: 초 단위의 정밀한 시간 측정을 위해 사용.
- 데코레이터: 실행 전후 시간을 측정하여 함수의 성능을 평가.
요약
Python 데코레이터는 코드를 수정하지 않고도 함수와 메서드의 동작을 확장하거나 수정할 수 있는 강력한 도구입니다. 장점과 단점이 명확하며, 성능 측정, 로깅, 인증 등 다양한 용도로 사용됩니다.
이 블로그에서 설명한 데코레이터로 성능을 측정해 보며, Python의 유연성을 체험해 보세요!