파이썬 decorator

Python decorator
파이썬 데코레이터
  • 데코레이터의 사전적 의미와 같이 기존 코드에 여러가지 기능을 추가하는 파이썬 구문

1 예시 1[ | ]

def call_logger(f):
    def g(*args, **kwargs):
        print("함수 호출 전")
        ret = f(*args, **kwargs)
        print("함수 호출 후")
        return ret
    return g

@call_logger
def func():
    pass

2 예시 2[ | ]

def p_wrapper(func):
   def func_wrapper(s):
       return "<p>{0}</p>".format(func(s))
   return func_wrapper

def div_wrapper(func):
    def func_wrapper(s):
        return "<div>{0}</div>".format(func(s))
    return func_wrapper

@div_wrapper
@p_wrapper
def greet(name):
    return "Hello, " + name + "."

print( greet("John") )
# <div><p>Hello, John.</p></div>

3 예시 3[ | ]

실전 사용시에는 functools wraps 어노테이션을 붙여 만들기를 권한다. wraps 를 붙이지 않으면, 데코레이션된 함수의 이름(__name__) 등 속성들이 망가진다.

from functools import wraps
from time import time

def time_logger(func):
   @wraps(func)
   def func_wrapper(*arg, **kwargs):
       ts = time()
       r = func(*arg, **kwargs)
       print("%s took %s sec."%(func.__name__, time()-ts))
       return r
   return func_wrapper

@time_logger
def my_func():
   # do my stuff
   pass

4 같이 보기[ | ]

5 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}