如何将带有参数作为参数的函数传递给Python中的另一个函数?

时间:2019-10-09 11:57:36

标签: python

我正在研究装饰器,并通过本示例进行了说明,我无法弄清楚如何可以访问在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)

2 个答案:

答案 0 :(得分:1)

您必须了解:

@decorator_function
def display_info(name, age):
    # ...

基本上就是:

def display_info(name, age):
    # ...

display_info = decorator_function(display_function)

decorator_functiondisplay_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_infodisplay_info(*('Bob', 29), **{})相同。

答案 1 :(得分:0)

在装饰器中,只需访问publish/deployargs[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