Why can't Python decorators be chained across definitions? -
why arn't following 2 scripts equivalent?
(taken question: 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> and decorated decorator:
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) why want know? i've written retry decorator catch mysqldb exceptions - if exception transient (e.g. timeout) re-call function after sleeping bit.
i've got modifies_db decorator takes care of cache-related housekeeping. modifies_db decorated retry, assumed functions decorated modifies_db retry implicitly. did go wrong?
the problem second example that
@makebold def makeitalic(fn): def wrapped(): return "<i>" + fn() + "</i>" return wrapped is trying decorate makeitalic, decorator, , not wrapped, function returns.
you can think intend this:
def makeitalic(fn): @makebold def wrapped(): return "<i>" + fn() + "</i>" return wrapped here makeitalic uses makebold decorate wrapped.
Comments
Post a Comment