DATA PROGRAMMING/PYTHON
[PYTHON] 함수 데코레이터 활용 실습
허니리즘
2023. 9. 20. 18:37
데코레이터(decorator)는 함수를 수정하지 않고 함수의 작동 방식에 변화를 주거나 특정 동작을 추가하는 역할을 한다. 기존 함수를 입력받아 이를 통해 새로운 함수 객체를 만들어 준다.
파이썬 함수 데코레이터
def decorate(func):
def wrapper():
print("함수 시작")
func()
print("함수 끝")
return wrapper
def hello():
print("hello")
say_hi = decorate(hello)
say_hi()
위 코드를 사용하면, hello()함수를 decorate() 함수의 인자로 대입할 수 있다.
이를 @decorate 기능을 통해 더 쉽게 실행할 수 있다.
def decorate(func):
def wrapper():
print("함수 시작")
func()
print("함수 끝")
return wrapper
@decorate
def hello():
print("hello")
hello()
decorate를 통해 hello()함수는 자동으로 decorate함수에 들어가고, hello()를 실행하면 아까와 같은 결과가 출력된다.
decorator는 마치 수학의 합성함수와 유사한 역할을 한다. 데코레이트 뒤에 정의된 함수를 데코레이트 전에 정의된 함수에 합성시키는 느낌이다.
우선 위 코드를 이해해보자. time.time() 함수는 현재 시스템 시간을 부르는 함수이다. 이를 start에 저장한다. 그리고 for 문을 활용하여 50개의 숫자를 출력한다. 마지막엔 다시 time.time()함수를 쓰고 start를 빼준다. 즉 마지막에 출력되는 값은 for문이 끝난 시점의 시스템 시각에서 for문 시작전에 실행한 시스템 시각을 빼주는 것이므로, for문의 작동 시간을 구하는 의미를 갖는다.
import time
def get_time(func):
def wrapper(*args, **kwargs):
# code here
start = time.time()
func()
return time.time() - start
#
return wrapper
@get_time
def for_loop(r=100000):
for i in range(r):
if i % 10000 == 0:
print(i)
return None
print(for_loop())
get_time이후 정의된 함수는 자동으로 get_time함수에 저장된다. 즉 for_loop함수의 실행시간이 얼마나 되는지 출력해 준다.