如何制作一系列函数装饰器?

  • 问题:
  • 如何在Python中创建两个decorator来完成以下任务?在

    @makebold
    @makeitalic
    def say():
    return "Hello"

    …应该返回:

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

    我并不是试图在一个真正的应用程序中以这种方式生成HTML,只是想了解decorator和decorator链是如何工作的

  • 答案:
  • 退房the documentation看看装修工是怎么工作的。以下是您的要求:

    from functools import wraps

    def makebold(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
    return "<b>" + fn(*args, **kwargs) + "</b>"
    return wrapped

    def makeitalic(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
    return "<i>" + fn(*args, **kwargs) + "</i>"
    return wrapped

    @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>"