Content · Programming · Python

Python Decorators with Arguments and functools.wraps()

Parameterized decorators need two layers: an outer function receives decorator settings, and an inner decorator receives the function being wrapped. functools.wraps preserves useful metadata of the original.

2 views Published Oct 17, 2026 Updated Oct 18, 2026 Admin

This guide explains decorators with arguments and functools.wraps() through a focused Python example. You will learn the behavior to expect, why it matters in a real program, and how to recognize the common mistakes before applying it in your own project.

What You Will Learn


Parameterized decorators need two layers: an outer function receives decorator settings, and an inner decorator receives the function being wrapped. functools.wraps preserves useful metadata of the original function.

When and Why to Use It


The following example focuses on a practical use of Decorators with Arguments and functools.wraps().

Step-by-Step Example


from functools import wraps

def repeat(times):
    def decorate(function):
        @wraps(function)
        def wrapper(*arguments, **options):
            for iteration in range(times):
                function(*arguments, **options)
        return wrapper
    return decorate

@repeat(2)
def greet(name):
    print(f"Hello, {name}")

greet("Kai")

Understanding the Example


repeat(2) creates the decorator; the inner wrapper forwards one name argument twice. wraps makes introspection and documentation friendlier.

Expected Output


Hello, Kai
Hello, Kai

Important Behavior and Edge Cases


The wrapper shown discards return values, which is fine for printing but wrong for decorators that must preserve a result.

Try It Yourself


Create a decorator that prints a label before a function and returns its original result.

Common Beginner Mistakes


  • The wrapper shown discards return values, which is fine for printing but wrong for decorators that must preserve a result.
  • Confusing a returned value with printed output, or failing to verify a function’s behavior with different input values.
  • Skipping the practice step and assuming the example covers every input. Test at least one normal case and one edge case relevant to this topic.

Key Takeaways


  • Parameterized decorators need two layers: an outer function receives decorator settings, and an inner decorator receives the function being wrapped.
  • repeat(2) creates the decorator; the inner wrapper forwards one name argument twice.
  • Apply the technique deliberately, checking its documented input requirements and failure behavior before integrating it into a larger project.
Share this resourceSend this page to someone who may find it useful.