Почему декораторы Python не могут быть связаны между собой определениями?
Почему арнт следующие два сценария эквивалентны?
(Взято из другого вопроса:Понимание Python Decorators)
def makebold(fn):
def wrapped():
return "" + fn() + ""
return wrapped
def makeitalic(fn):
def wrapped():
return "" + fn() + ""
return wrapped
@makebold
@makeitalic
def hello():
return "hello world"
print hello() ## returns hello world
и с декорированным декоратором:
def makebold(fn):
def wrapped():
return "" + fn() + ""
return wrapped
@makebold
def makeitalic(fn):
def wrapped():
return "" + fn() + ""
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
также повторил бы неявно. Где я неправ?