当前位置: 首页 > 知识库问答 >
问题:

在不同的场景中,将带参数的函数传递给装饰器的区别

万俟承望
2023-03-14

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

  • 代码-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) 

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

而下面的代码将args和kwargs作为参数。

  • 代码-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):
    print("Function info has {} and {} as arguments.".format(name, age))

display() 
function_info('Jim',23)

有人能解释一下区别吗?

为什么在CODE-1中,当两个方法都在同一个装饰器中时,function_info(名称、年龄)没有任何错误,但是在CODE-2中,当两个方法都单独装饰时,function_info(名称、年龄)需要args和kwargs?

共有1个答案

薛高澹
2023-03-14

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

代码-1:

在display
display func run
函数信息之前执行的包装将John和23作为参数。

代码-2:

在display
display func run
函数信息之前执行的包装器将Jim和23作为参数。

问题是,decorator只在没有参数的函数显示上使用。

如果你把

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

然后-对于这两个代码-您需要*args、**kwargs,因为在执行函数\u info()之前执行包装器函数()。由于函数_info()接受参数,您还需要decorator中包装器_函数()的参数,否则解释器会抱怨一个函数有两个参数不接受任何参数。

输出:

显示之前执行的包装
显示函数运行之前执行的包装
函数信息之前执行的包装将Jim和23作为参数。

 类似资料:
  • 问题内容: 我正在学习Python。希望有人指出我正确的方法。 这是我想在下面做的事情: 任何想法?提前致谢。 问题答案: 您不能将其作为自己的名称传递,但是可以将其添加到关键字中。 另外,您可以命名自己的参数: 类方法:

  • 问题内容: 我在装饰器传递变量时遇到问题。我可以通过以下装饰器语句来做到这一点: 但不幸的是,该声明不起作用。也许也许有更好的方法来解决此问题。 问题答案: 带参数的装饰器的语法有些不同-带参数的装饰器应返回一个函数,该函数将接受一个函数并返回另一个函数。因此,它实际上应该返回一个普通的装饰器。有点混乱吧?我的意思是: 在这里,你可以阅读有关该主题的更多信息-也可以使用可调用对象来实现此目的,这也

  • 问题内容: 我正在使用python flask框架。我编写了一个需要一个参数的装饰器,该参数是动态的。 我的装饰器如下所示,将获得一个密钥,并使用该密钥从redis获取数据。 而且我有一个使用这种装饰器的类,像这样的代码 如您所见,我的装饰器需要一个名为的参数,然后像这样传递密钥 将获得城市的ID,如果一切正常,密钥将如下所示 但我得到了错误: 我很困惑,在烧瓶中,如何将动态参数传递给装饰器? 谢

  • 将函数传递给另一个函数的Scala示例缺少传递的函数(时间段)接受参数(x)的情况。 我怎样才能使上述代码工作? 编辑:我在oncepersecond中添加了一个x,以明确目标是传递整数。

  • 让我们假设下面的方法(从番石榴的Iterables说): 这个系列: 然后编译以下代码并正确导出泛型 (在Guava中,这将返回< code>objs中所有字符串的iterable。) 但是现在让我们假设以下类: 我不知道如何调用并获取

  • 在Swift编程语言中,它说: 函数也可以接受可变数目的参数,将它们收集到数组中。 当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样一个函数时,它们在函数中作为一个数组可用。 问题:如果我已经有一个数组要传递给这个函数,该怎么办? 这将失败,并出现编译器错误,“无法找到接受所提供参数的'__conversion'的重载”。有没有办法把一个现有的数组变成一个我可以传递给一个变量函数的