본문 바로가기

Python

[Python] 파이썬 데코레이터 (decorator)

반응형



파이썬에는 데코레이터라는 기능이 있습니다. 사전적으로는 '꾸며주는 사람'이라는 뜻이 있는데요. 이 기능은 함수의 기능을 확장하고 싶은 경우에 사용합니다. 구현상으로는 함수를 인자로 받아 함수의 기능을 추가한 후 다시 리턴해주는 형식으로 구현합니다. 이해하기 어려우실 테니 예제를 통해 살펴보도록 하겠습니다.

만약 특정 함수의 실행시간을 측정하고 싶다면 아래와 같이 코드를 작성할 수 있습니다. 

import time

def func_time_interval(funct):
	def time_check(*args, **kwargs):
		start_time = time.perf_counter()
		result = funct(*args, **kwargs)
		finished_time = time.perf_counter()
		print('실행 소요 시간:', finished_time - start_time)
		return result
	return time_check

def square(n):
	return n*n
	
new_funct = func_time_interval(square)
new_funct(5)
실행 소요 시간: 2.0680004126916174e-06 


위 코드는 func_time_interval의 인자로 받은 함수의 기능을 time_check함수에서 수행하는 기능인데,
추가적으로 시작시간과 종료시간을 계산하여 함수 실행 시간을 출력해주는 함수입니다. 
데코레이터는 이렇게 함수의 기능을 추가하여 사용할 수 있습니다. 즉 n을 제곱하는 기능 이외에 함수 실행 시간을 측정하는 기능이 추가된 것이죠.

파이썬에서는 더 깔끔한 코드를 제공하기 위해 아래와 같이 사용할 수도 있습니다.

import time

def func_time_interval(funct):
	def time_check(*args, **kwargs):
		start_time = time.perf_counter()
		result = funct(*args, **kwargs)
		finished_time = time.perf_counter()
		print('실행 소요 시간:', finished_time - start_time)
		return result
	return time_check

@ func_time_interval
def square(n):
	return n*n
	
square(5)
실행 소요 시간: 1.1300435289740562e-06 


즉 위처럼 @하고 꾸며주는 함수의 명을 넣으면 위의 복잡한 코드를 단순화할 수 있습니다.

반응형