2016-12-24 10 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ブロック)は、デコレータ構文砂糖なしのように見える?

答えて

2

あなたはデコレータ関数にラップして、引数と返されたラッパーを呼び出したい関数渡す必要がありますどのようにgetHTMLCodeの装飾が施されたバージョンのようなwrapped_getHTMLCode作品

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

お知らせ。太字にしたい文字列で呼び出すと、太字のHTMLマークが付いた文字列が返されます。

関連する問題