W3docs

How do I make function decorators and chain them together?

Function decorators allow you to wrap a function in another function.

Function decorators allow you to wrap a function in another function. This can be useful for adding additional behavior to a function, such as logging, timing, or counting how many times a function has been called.

To create a function decorator in Python, you need to define a function that takes another function as an argument, and then defines a new function that wraps the original function and adds the additional behavior that you want. You can then use the @ symbol followed by the name of the decorator function to apply the decorator to the original function.

Here's an example of a simple function decorator that logs the arguments and return value of a function:

A simple function decorator that logs the arguments and return value of a function in Python

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f'Calling {func.__name__} with arguments {args} and keyword arguments {kwargs}')
        result = func(*args, **kwargs)
        print(f'{func.__name__} returned {result}')
        return result
    return wrapper

To use this decorator, you would apply it to a function like this:

Use a decorator and apply it to a function in Python

@log
def add(x, y):
    return x + y

Now, every time you call the add function, it will be logged by the decorator.

You can chain multiple decorators together by applying them one after the other. For example:

Chain multiple decorators together by applying them one after the other in Python

import time
import functools

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        print(f'{func.__name__} took {time.time() - start:.4f} seconds')
        return result
    return wrapper

@log
@timer
def add(x, y):
    return x + y

This will apply both the log decorator and the timer decorator to the add function.

Decorators are applied from bottom to top. In this case, the timer decorator is applied to add first, and then the log decorator is applied to the resulting decorated function.