Skip to the content.

Create Function Decorator With Optional Arguments

Solution

from functools import wraps, partial

def decorator(func=None, *, arg1=None, arg2=None):
    if func is None:
        return partial(decorator, arg1=arg1, arg2=arg2)

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

    return wrapper

Usage

@decorator(1, 2)
def func(*args, **kwargs):
    """original function."""
    print('run func')

References