2014-03-25 110 views
0

我是新來的蟒蛇,我現在正在學習修飾符。這是我工作的蟒蛇裝飾例如:Python - 裝飾錯誤

def makeHtmlTag(tag, *args, **kwds): 
    def real_decorator(fn): 
     css_class = " class='{0}'".format(kwds["css_class"]) \ 
            if "css_class" in kwds else "" 

     def wrapped(): 
      return "<"+tag+css_class+">" + fn() + "</"+tag+">" 
     return wrapped 
    return real_decorator 

@makeHtmlTag(tag="i", css_class="italic_css") 
def hello(): 
    return "hello world" 

print hello() 

當我只有一條線替換功能wrapped()如下:

return "<"+tag+css_class+">" + fn() + "</"+tag+">" 

我得到TypeError。這是爲什麼?

+2

真正的裝飾需要返回一個函數,而不是一個字符串。 –

回答

6

裝飾器替換函數對象;基本上執行的語法爲:

def hello(): 
    return "hello world" 
hello = makeHtmlTag(tag="i", css_class="italic_css")(hello) 

makeHtmlTag()返回real_decorator()功能,其被稱爲與hello作爲參數,並且它反過來返回wrapped()

所以,在裝飾器被調用之後,hello現在綁定到wrapped()函數返回的嵌套函數real_decorator()

如果return語句,返回只是一個字符串替換def wrapped() ... return wrapped,然後hello現在綁定到該字符串,不是一個函數了。您不能調用字符串對象,導致您的TypeError異常。