2016-12-24 1 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-надписью.

Смежные вопросы