我正在学习装饰器,并发现这个有用的线程对我帮助很大。 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()
工作代码(第二个块)与装饰器语法糖看起来是什么样的?
答案 0 :(得分:2)
您需要将您想要包装的函数传递给装饰器函数,然后使用参数调用返回的包装器:
wrapped_getHTMLCode = addBold(getHTMLCode)
wrapped_getHTMLCode('Hello')
请注意wrapped_getHTMLCode
如何像getHTMLCode
的装饰版本一样工作。你用你想要粗体的字符串来调用它,并返回带有HTML粗体标记的字符串。