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 we show a decorator that is in charge of logging when the function is about to run:
# decorator_wraps_1.pydef trace_decorator(function): def wrapped(*args, **kwargs): logger.info("running %s", function.__qualname__) return function(*args, **kwargs) return wrapped
Now, let's imagine we have a function with this decorator applied to it. We might initially think that nothing of that function is modified with respect to its original definition:
@trace_decorator ...