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

如何让装饰器处理任意参数

师赤岩
2023-03-14

我试图理解装饰器。我想定义一个可以处理任何任意参数的装饰器。我正在尝试以下方法:

def a_decorator_passing_arbitrary_arguments(function_to_decorate):
    def a_wrapper_accepting_arbitrary_arguments(*args,**kwargs):
        print('The positional arguments are', args)
        print('The keyword arguments are', kwargs)
        function_to_decorate(*args)
    return a_wrapper_accepting_arbitrary_arguments

这是基于本教程的,它应该处理任何类型的参数。但是,当我只传递关键字参数时,我得到以下带有函数f(a, b, c)的输出:

@a_decorator_passing_arbitrary_arguments
def f(a,b,c):
    print("The arguments here are the following: {0}, {1}, {2}.".format(a,b,c))

f(a='ali', b='emma', c='t')

输出:

The positional arguments are ()
The keyword arguments are {'a': 'ali', 'b': 'emma', 'c': 't'}

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-cc5ee8d7120a> in <module>
----> 1 f(a='ali', b='emma', c='t')

<ipython-input-1-af03800e2abd> in a_wrapper_accepting_arbitrary_arguments(*args, **kwargs)
      3         print('The positional arguments are', args)
      4         print('The keyword arguments are', kwargs)
----> 5         function_to_decorate(*args)
      6     return a_wrapper_accepting_arbitrary_arguments

TypeError: f() missing 3 required positional arguments: 'a', 'b', and 'c'

在所有变量都作为关键字参数传递的情况下,如何避免出现这种错误?

共有1个答案

栾和风
2023-03-14

您当前只向包装函数传递位置参数,而不是关键字参数。

def a_decorator_passing_arbitrary_arguments(function_to_decorate):
    def a_wrapper_accepting_arbitrary_arguments(*args,**kwargs):
        print('The positional arguments are', args)
        print('The keyword arguments are', kwargs)
        # function_to_decorate(*args)  # Wrong
        return function_to_decorate(*args, **kwargs)  # Right
    return a_wrapper_accepting_arbitrary_arguments

(您还应该返回从包装器返回的任何function_to_decorate

 类似资料:
  • 问题内容: 我想制作一个可以使用或不使用参数的装饰器: 在我的代码中,只有使用带参数的decorator才有效:如何使两者同时起作用(带有和不带有参数)? 问题答案: 我找到一个示例,您可以使用或:不错!

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

  • 问题内容: 我在与装饰器一起使用docstrings时遇到问题。给出以下示例: 现在,该帮助未像预期那样向我显示文档字符串,而是显示: 没有装饰器,帮助是正确的: 我知道,该函数由装饰器包装,因此该函数对象不再是该函数。但是,按预期方式获得文档字符串(和帮助)的最佳解决方案是什么? 问题答案: 使用更新装饰的属性: 另请参阅标准库文件的。

  • 问题内容: 我想定义一些通用装饰器,以在调用某些函数之前检查参数。 就像是: 旁注: 类型检查只是在这里显示一个示例 我正在使用Python 2.7,但是Python 3.0也会很有趣 问题答案: 从装饰器的功能和方法: Python 2 Python 3 在Python 3中已更改为,并且已更改为。 用法: 可以是或

  • 问题内容: 考虑这个小例子: 哪个打印 为什么参数(应该是Test obj实例)没有作为第一个参数传递给装饰函数? 如果我手动进行操作,例如: 它按预期工作。但是,如果我必须事先知道某个函数是否装饰,它就破坏了装饰器的全部目的。这里的模式是什么,还是我误会了什么? 问题答案: tl; dr 您可以通过将类作为描述符并返回部分应用的函数来解决此问题,该函数从中应用对象作为参数之一,如下所示 实际问题