我在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"。
非常感谢你!
答案 0 :(得分:0)
这可能是因为你试图用装饰器包装一个类的方法。编写处理类的方法的装饰器的要求有点不同,如果你需要一个可以处理正常函数和类方法的装饰器,那就更糟了。
你最好使用一个帮助你实现装饰器而不是试图自己动手的包,因为如果你自己尝试这样做会有很多问题。
我建议您查看wrapt
包。参见:
还值得一读:
如果您认为手动装饰器总能正常工作。
如上所述,否则提供调用get()
的代码。如果这种呼叫以某种奇特的方式被打乱,那可能会导致问题。