A decorator for decorators, which preserves the signature of the function being wrapped. This preservation allows IDE function parameter hints to work on the wrapped function. To do this, the __signature__ dunder is defined, or inherited, from the function being wrapped to the resulting wrapped function.

Parameters:f (callable) – The function being wrapped.
Returns:Wrapped version of the function.
Return type:callable


>>> def a_decorator(f):
...     @preserve_signature
...     @functools.wraps(f)
...     def wrapper(*args, **kwargs):
...         return wrapper(*args, **kwargs)
...     return wrapper