2011년 7월 30일 토요일

파이썬 데코레이터 (python decorator)

- 파이썬 데코레이터

데코레이터는 한글 이름은 장식자 정도로 번역되는데
이 역시 design pattern에서 나온 이름이고요,

근데 이게 장식자라고 하면 일단 뭔가 감도 잘 안오고 하는데

이 데코레이터의 개념은 일종의 함수 wrapping입니다.

함수를 바깥에서 한번 싸는거죠.




@deco_method
def func1(x):
    return x+1

이런식의 함수가

func1 = deco_method(func1)  

이런식으로 한번 래핑(wrapping)을 해주는 것입니다.


import time

def elapsed_time(functor):
     def decorated(*args, **kwargs):
             start = time.time()
             functor(args, kwargs)
             end = time.time()
             print "Elapsed time: %f" % (end-start)
     return decorated
  

@elapsed_time
def hello():
     print 'hello'
    
보통 이런식으로 많이들 사용합니다. 위의 예제는 하나의 함수가 시간이 얼마나 걸리는지를 재는데 사용하는 예제이고요,

functor가 래핑할 함수이고요,
start, end부분은 전후로 들어갈 부분입니다.

그래서 사용예제들을 보면 디버깅하는데 사용하거나,
-> arg, kwargs를 조사해서, 값을 찍어주는 용도로 쓰기도 하고요

자주사용하는 진입루틴, 출구루틴에 사용을 합니다.

ex ) @login
login이 되어있으면 함수를 실행 아니면, 패스하는 식의 조건을 걸고,
함수를 실행시키는 다던지 하는 용도로 많이 사용을 합니다.


또 데코레이터는 argument를 받을 수도 있습니다.

@deco_method(argument)

이런형태로 쓰여져서 실제로 함수를 wrapping하는 중간에
다른동작도 가능하게 설계가 되어있습니다.



찾아보면 활용법이 많은 방법입니다.
전통적인 언어와는 좀 다르기때문에 헷갈릴수도 있는데 쓰면 쓸수록 장점이 많은 방법입니다.

또 위에서는 함수 데코레이터에 대해서만 얘기를 했는데,
클래스 데코레이터라는게 있습니다.

요것에 대해서는 조만간 또 작성을 해보겠습니다.














댓글 없음:

댓글 쓰기