Python Decorator
Logger
def logger(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
return wrapper
@logger
def add(x, y):
print('{} + {} = {}'.format(x, y, x+y))
Decorator with arguments
def periodic_task(spacing):
def wrapper(func):
def deco(*args, **kwargs):
# logic with spacing
func(*args, **kwargs)
return deco
return wrapper
@periodic_task(spacing=60)
def send_mail():
pass
@periodic_task(spacing=86400)
def ntp()
pass
Class decorator without args
class logger(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("[INFO]: the function {func}() is running..."\
.format(func=self.func.__name__))
return self.func(*args, **kwargs)
@logger
def say(something):
print("say {}!".format(something))
say("hello")
Class decorator with arguments
class logger(object):
def __init__(self, level='INFO'):
self.level = level
def __call__(self, func):
def wrapper(*args, **kwargs):
print("[{level}]: the function {func}() is running..."\
.format(level=self.level, func=func.__name__))
func(*args, **kwargs)
return wrapper
@logger(level='WARNING')
def say(something):
print("say {}!".format(something))
say("hello")