问题描述
我从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)方法,它将传递参数,而不会给出任何错误。
- 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作为参数。