decorators logo decorators: inputs

1 2 3 4 5 6 7 8 9 10

We can also have decorators that accept inputs. This makes for even more expressiveness. You do need to pay attention when you're declaring them though.

The example below gives a full demonstration.

import time
import random
from functools import wraps

def loggg(show_name=True, show_time=True):
    def stopwatch(f):
        def func(*args, **kwargs):
            tic = time.time()
            result = f(*args, **kwargs)
            result = "call"
            if show_name:
                result = f"{result} {f.__name__}"
            if show_time:
                result = f"{result} time:{time.time() - tic}"
            return result
        return func
    return stopwatch

@loggg(show_name=False, show_time=True)
def sleep_random(s):
    """This function sleeps at least for `s` seconds."""
    return time.sleep(s + random.random()/100)