2014-03-25 82 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异常。