带有* args和** kwargs的Python装饰器无法执行有关太多位置参数的错误消息

时间:2016-06-19 20:42:57

标签: python python-3.x python-decorators

我在Python上编写装饰器的任何文章,教程都指出我使用* args和** kwargs来编写可以应用于任何函数和/或方法的装饰器(包括this great introduction )。

但是我现在有以下代码:

def format_result(func):
    @wraps(func)
    def func_wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        # do something with result
        return result

    return func_wrapper

然后我使用如下:

class CategoryList(BaseResource):
    '''List or create categories'''

    @format_result
    def get(self):
        '''Create a new category'''
        return {'id': 1, 'name': 'Test Category'}

在我的应用程序中使用此代码时,我总是收到以下错误消息:

File "...\__init__.py", line 66, in func_wrapper
    result = func(*args, **kwargs)
TypeError: get() takes 1 positional argument but 2 were given

我做错了吗?如果相关,我的python -V是" Python 3.5.1"。

非常感谢你!

1 个答案:

答案 0 :(得分:0)

这可能是因为你试图用装饰器包装一个类的方法。编写处理类的方法的装饰器的要求有点不同,如果你需要一个可以处理正常函数和类方法的装饰器,那就更糟了。

你最好使用一个帮助你实现装饰器而不是试图自己动手的包,因为如果你自己尝试这样做会有很多问题。

我建议您查看wrapt包。参见:

还值得一读:

如果您认为手动装饰器总能正常工作。

如上所述,否则提供调用get()的代码。如果这种呼叫以某种奇特的方式被打乱,那可能会导致问题。