将装饰器转换为其实现代码

时间:2016-12-24 02:29:15

标签: python python-decorators

我正在学习装饰器,并发现这个有用的线程对我帮助很大。 How to make a chain of function decorators?

根据我的理解,装饰者只是语法糖。但是,我无法从语法糖代码转换为非语法糖代码。

# Decorators
def addBold(func):
    def wrapper(*arg1):
        print("Bold Added")
        return '<b>' + func(*arg1) + '</b>'
    return wrapper

def addItalic(func):
    def wrapper(*arg1):
        print("Italic Added")
        return '<i>' + func(*arg1) + '</i>'
    return wrapper

此代码有效:

@addBold
def getHTMLCode(passedText):
    return passedText

newVar = getHTMLCode('Hello')
print(newVar)
# outputs: Bold Added <b>Hello</b>

我尝试过转换为非语法糖代码,但这不起作用(TypeError: 'str' object is not callable):

def getHTMLCode(passedText):
    return passedText

newVar = addBold(getHTMLCode('Hello'))  # returns wrapper
newVar()

工作代码(第二个块)与装饰器语法糖看起来是什么样的?

1 个答案:

答案 0 :(得分:2)

您需要将您想要包装的函数传递给装饰器函数,然后使用参数调用返回的包装器:

wrapped_getHTMLCode = addBold(getHTMLCode)
wrapped_getHTMLCode('Hello')

请注意wrapped_getHTMLCode如何像getHTMLCode的装饰版本一样工作。你用你想要粗体的字符串来调用它,并返回带有HTML粗体标记的字符串。