任何文章,教程等。我已经阅读了python中的写作装饰师,已经指出我使用 *args和** kwargs编写可以应用于任何功能和/或方法(包括此精彩介绍)。
但是我现在有以下代码:
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"。
非常感谢您!
它可能是因为您试图用装饰器包装一堂课的方法。在班级方法上使用的编写装饰器的要求有所不同,如果您需要一个可以在类同时使用的一个装饰器,甚至更糟。
您使用一个包装可以帮助您实施装饰者而不是尝试自己做的软件包,因为如果尝试自己做很多。
有很多陷阱。我建议您查看wrapt
软件包。请参阅:
- http://wrapt.readthedocs.io
也值得阅读:
- http://blog.dscpl.com.au/p/decorators-and-monkey-patching.html
如果您认为手滚装饰器总是会工作的。
如上所述,否则提供了调用get()
的代码。如果此呼叫以某种方式关闭,那可能会引起问题。