Search⌘ K
AI Features

Effective Decorators—Avoiding Common Mistakes

Explore how to create effective decorators in Python by avoiding common pitfalls that alter the original function's properties. Learn to use functools.wraps to maintain attributes, docstrings, and annotations for better code reusability, debugging, and unit testing.

While decorators are a great feature in Python, they are not exempt from issues if used incorrectly. Let's look at some common issues to avoid in order to create effective decorators.

Preserving data about the original wrapped object

One of the most common problems when applying a decorator to a function is that some of the properties or attributes of the original function are not maintained, leading to undesired, and hard-to-track, side effects.

To illustrate this, let's look at a decorator that is in charge of logging when the function is about to run:

Python 3.8
def trace_decorator(function):
def wrapped(*args, **kwargs):
logger.info("running %s", function.__qualname__)
return function(*args, **kwargs)
return wrapped
...