2016-12-24 32 views
0

我学习的装饰,并发现这个有用的线索,真正帮了我很多。 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() 

什么工作代码(第二块)看起来像没有装饰者语法糖?

回答

2

你需要传递你想换到装饰功能的函数,然后调用返回的包装与参数:

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

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