【发布时间】:2013-08-21 01:46:55
【问题描述】:
我的 API 中有以下方法,我想让 serve 函数成为装饰器,以便可以像这样使用它:@api.serve。
def add_rule(self, func, methods):
for item in methods:
if item in self._config["MAP"]:
raise RuntimeError("Cannot override functions.")
self._config["MAP"][item] = func
def serve(self, methods=["POST","GET","HEAD"]):
def wrapper(func):
self.add_rule(func, methods)
return func
return wrapper
但是,一切似乎都不起作用,即在 _config["MAP"] 字典中设置项目。没有错误,但它没有做它应该做的事情。有人可以帮帮我吗?
【问题讨论】:
-
我认为您对
self的引用可能有问题,请参阅stackoverflow.com/questions/1263451/… -
要使您的代码正常工作,您需要使用
@api.serve();注意添加的括号。您必须调用serve,然后返回wrapper,然后用于装饰函数。如果没有括号,则将修饰函数替换为wrapper函数的(损坏的)变体。 -
不,当我使用非装饰器版本时,它实际上工作得很好:做
api.add_rule(serve, ["POST"])给我{'POST': <function serve at 0x1017969e0>},但我需要制作它的装饰器版本。 -
@l4mpi 哦,我明白了...谢谢!但是为什么我必须使用括号呢?
-
@Eugene 您是否从其他地方获得此代码?您要使用的实际装饰器是
wrapper函数;这是由调用serve返回的。在这种情况下,它很有用,因为您可以更改methods列表以防您不想要默认值;例如@api.serve(["GET"])产生一个只注册GET方法的装饰器。