为什么以下两个脚本不等效?
(摘自另一个问题:了解 Python 装饰器 https://stackoverflow.com/questions/739654/understanding-python-decorators)
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makebold
@makeitalic
def hello():
return "hello world"
print hello() ## returns <b><i>hello world</i></b>
并带有装饰器:
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
@makebold
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makeitalic
def hello():
return "hello world"
print hello() ## TypeError: wrapped() takes no arguments (1 given)
我为什么想知道?我写了一个retry
装饰器来捕获 MySQLdb 异常 - 如果异常是暂时的(例如超时),它将在休眠一段时间后重新调用该函数。
我也有一个modifies_db
装饰器负责一些与缓存相关的内务处理。modifies_db
装饰有retry
,所以我假设所有函数都装饰有modifies_db
也会隐式重试。我哪里做错了?
第二个例子的问题在于
@makebold
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
正在尝试装饰makeitalic
,装饰器,而不是wrapped
,它返回的函数。
你可以做我认为你想做的事情,如下所示:
def makeitalic(fn):
@makebold
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
Here makeitalic
uses makebold
装饰wrapped
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)