Skip to content

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")