The outer function will be given any arguments you pass explicitly, and should return the inner function. The inner function will be passed the function to decorate, and return the modified function. Usually you want the decorator to change the function behavior by wrapping it in a wrapper function.
Sometimes the decorator function has no control over the arguments passed from decorated function, to solve this problem, add (*args, **kwargs) to the wrapper function, this way the wrapper function can accept any number, and any type of arguments, and pass them to the decorated function.
In this tutorial, you'll learn how to define Python decorators with arguments by using decorator factory.

Furthermore, visual representations like the one above help us fully grasp the concept of Decorator With Function Passed Arguments.
An argument can be passed through Python decorators to the inner function. Decorators with arguments must propagate the parameter inside the decorator definition.
While simple decorators are useful, decorators with arguments offer even more flexibility. They enable you to customize the behavior of the decorated function based on the provided arguments. This blog post will delve deep into Python decorators with arguments, covering fundamental concepts, usage methods, common practices, and best practices.