pythonfunctiondecoratorpython-decoratorschain

How do I make function decorators and chain them together?


How do I make two decorators in Python that would do the following?

@make_bold
@make_italic
def say():
   return "Hello"

Calling say() should return:

"<b><i>Hello</i></b>"

Solution

  • Check out the documentation to see how decorators work. Here is what you asked for:

    from functools import wraps
    
    def makebold(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            return "<b>" + fn(*args, **kwargs) + "</b>"
        return wrapper
    
    def makeitalic(fn):
        @wraps(fn)
        def wrapper(*args, **kwargs):
            return "<i>" + fn(*args, **kwargs) + "</i>"
        return wrapper
    
    @makebold
    @makeitalic
    def hello():
        return "hello world"
    
    @makebold
    @makeitalic
    def log(s):
        return s
    
    print hello()        # returns "<b><i>hello world</i></b>"
    print hello.__name__ # with functools.wraps() this returns "hello"
    print log('hello')   # returns "<b><i>hello</i></b>"