我正在研究装饰器,并通过本示例进行了说明,我无法弄清楚如何可以访问在wrapper_function中作为参数(函数display_info)发送的函数参数,而不必先接收然后作为decorator_function的第一位参数
(我想我了解* args和** kwargs的概念,但是在下面的示例中,decorator函数只能使用一个参数,但是在访问中的包装器* args表示与参数一起发送的参数display_info)。
def decorator_function(originla_function):
def wrapper_function(*args, **kwargs):
#how wrapper accessed the arguments that weren't received on decorator_function
print('wrapper executed before {}'.format(originla_function.__name__))
return originla_function(*args, **kwargs)
return wrapper_function
@decorator_function
def display_info(name, age):
print('display_info has the following arguments ({}, {})'.format(name, age))
display_info('Bob', 29)
答案 0 :(得分:1)
您必须了解:
@decorator_function
def display_info(name, age):
# ...
基本上就是:
def display_info(name, age):
# ...
display_info = decorator_function(display_function)
decorator_function
将display_function
函数转换为另一个函数。只能执行一次。就是这样,仅此而已。从现在开始,重要的是decorator_function
返回了什么,而不是为了创建此新函数而如何调用decorator_function
。
现在,您的示例在幕后发生了什么?
@decorator_function
def display_info(name, age):
将display_info
替换为decorator_function(display_info)
。 decorator_function(display_info)
返回什么?此功能:
def wrapper_function(*args, **kwargs):
#how wrapper accessed the arguments that weren't received on decorator_function
print('wrapper executed before {}'.format(display_info.__name__))
return display_info(*args, **kwargs)
请注意,我将originla_function
替换为display_info
是因为originla_function
的{{1}}参数是原始 decorator_function
。>
因此,运行display_info
会调用 new display_info('Bob', 29)
,即display_info
。像这样调用wrapper_function('Bob', 29)
时,wrapper_function
将是*args
,而('Bob', 29)
将是**kwargs**
。
{}
表示它返回调用原始 return display_info(*args, **kwargs)
的结果。更准确地说,display_info
与display_info(*('Bob', 29), **{})
相同。
答案 1 :(得分:0)
在装饰器中,只需访问publish/deploy
和args[0]
-这些是位置参数
您将其传递给其他任何方法或函数:
args[1]
在装饰器输出中
print(args[0], args[1])
所以在您的装饰器中:
Bob 29
def decorator_function(originla_function):
def wrapper_function(*args, **kwargs):
# Output positional arguments args[0] and args[1] or implement logic processing them
print(args[0], args[1])
print('wrapper executed before {}'.format(originla_function.__name__))
return originla_function(*args, **kwargs)
return wrapper_function
是您的位置(在情况下只有它们通过),*args
是关键字参数,在示例中未使用。
如果您想使用通过参数传递给它的参数化装饰器, 这是一个例子:
**kwargs