在不同情况下将带有参数的函数传递给装饰器的区别

问题描述

我从Corey Schafer的Python装饰器教程中获得了这段代码。我在下面给出两个代码

  • CODE-1
def decorator_function(original_function):
    def wrapper_function():
        print("Wrapper executed before {}".format(original_function.__name__))
        return original_function()
    return wrapper_function

@decorator_function
def display():
    print("display func ran")

def function_info(name,age):
    print("Function info has {} and {} as arguments.".format(name,age))

display()
function_info('John',23) 

这将正确执行代码。但是,如果我们采用function_info(name,age)方法,它将传递参数,而不会给出任何错误

同时,下面所述的代码将args和kwargs作为参数。

  • CODE-2
def decorator_function(original_function):
    def wrapper_function(*args,**kwargs):
        print("Wrapper executed before {}".format(original_function.__name__))
        return original_function(*args,**kwargs)
    return wrapper_function

@decorator_function
def display():
    print("display func ran")

def function_info(name,age))

display() 
function_info('Jim',23)

有人可以解释一下我的区别吗?

为什么在CODE-1中,当两个方法都在同一个装饰器中时,对于function_info(name,age)没有给出任何错误,但是在CODE-2中,当两个方法分别装饰时,function_info(name,age)需要args和kwargs

解决方法

这两个函数的输出基本相同-无论您是否使用参数*args,**kwargs(已通过https://www.onlinegdb.com/online_python_interpreter测试)。

CODE-1:

在显示之前执行包装器
显示功能已运行
函数信息以John和23作为参数。

代码-2:

在显示之前执行包装器
显示功能已运行
函数信息以Jim和23作为参数。

问题是装饰器仅用于不带参数的函数显示。

如果你放

@decorator_function
def function_info(name,age):
    print("Function info has {} and {} as arguments.".format(name,age))

然后-对于这两个代码-您都需要*args,**kwargs,因为wrapper_function()是在执行function_info()之前执行的。而且当function_info()接受参数时,您还需要装饰器中wrapper_function()的参数,否则解释器会抱怨该函数没有任何参数的两个参数。

输出:

在显示之前执行包装器
显示功能已运行
包装函数在function_info之前执行
函数信息以Jim和23作为参数。