Skip to the content.

Create Function Decorator Without Argument

Solution

from functools import wraps


def decorator(_func):
    @wraps(_func)
    def wrapper(*args, **kwargs):
        """wrapper function."""
        print(f'run wrapper: {args}, {kwargs}')
        return _func(*args, **kwargs)

    return wrapper

Usage

@decorator
def func(*args, **kwargs):
    """original function."""
    print(f'run func: {args}, {kwargs}')

Result

# Without Arguments
>>> func()
run wrapper: (), {}
run func: (), {}

# With Arguments
>>> func('arg1', 'arg2')
run wrapper: ('arg1', 'arg2'), {}
run func: ('arg1', 'arg2'), {}

Meta attributes

>>> func.__module__
'**main**'
>>> func.__name__
'func'
>>> func.__doc__
'original function.'
>>> func.__annotations__
{}
>>> func.__qualname__
'func'

Without @functools.wraps, some attributes have not been passed:

>>> func.__module__
'__main__'
>>> func.__name__
'wrapper'
>>> func.__doc__
'wrapper function.'
>>> func.__annotations__
{}
>>> func.__qualname__
'decorator.<locals>.wrapper'

References