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'