유튜브를 둘러보다가 python 함수 위에 써있는 @에 당황한 햄스터가 그려진 썸네일이 눈에 들어왔다.
함수 위에 있는 @가 데코레이터라는 이름이라는 건 알고 있었는데, 어떤 기능을 하는지는 모르고 있었다. 영상이 길지 않으니 한번 공부해볼 겸 눌러봤다. 그리고 아주 만족했다. 영상을 본 후에 '이렇게 사용하면 되겠구나. 바로 써보고 싶다.'라고 생각이 들었기 때문이다. 이번 글에는 위 영상에서 소개된 내용을 내 방식대로 간단히 정리해봤다. 글만으로는 이해가 좀 어렵다면 영상을 보면 더 이해가 쉽다.
해당 영상 외에도 가볍게 공부하기 좋은 영상이 많이 보여서 차차 정리해볼까 한다. 이 글을 읽고 계신 분들은 한번쯤 채널에 들어가보시는 것을 추천합니다. (유튜브 채널: 임커밋)
데코레이터란?
Python에서 데코레이터는 함수를 더 큰 함수로 묶는 과정을 쉽게 만드는 문법이다. 함수를 인자로 받아서, 그 함수에 뭔가를 추가하고 다시 반환하는 형태다. 중복되는 로직을 깔끔하게 처리하거나, 코드를 더 읽기 쉽게 만들 수 있다. (남용하면 오히려 지저분해진다.)
예시 코드
def decorator_func(func):
def wrapper():
print("Before function call")
func()
print("After function call")
return wrapper
@decorator_func
def greet():
print("Hello, Python!")
greet()
출력 결과:
Before function call
Hello, Python!
After function call
실무에 유용한 데코레이터 예제
로그를 남기거나, 실행 시간을 측정할 때 데코레이터가 유용하다.
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} took {end - start:.4f} seconds")
return result
return wrapper
@timer
def slow_function():
time.sleep(2)
print("Finished slow task")
slow_function()
이렇게 함수 호출 전에 시작 시간을 기록하고, 끝나면 걸린 시간을 출력하는 데코레이터를 만들 수 있다. 매번 같은 코드를 복붙하지 않아도 되니 편리해보인다. 매 함수마다 스케줄러에 로그를 찍어댔는데 이제 더 보기 좋게 코드를 짤 생각에 벌써 기분이 좋다.