Python - 装饰器错误

zan*_*ngw 0 python decorator python-decorators

我是python的新手,现在我正在学习装饰器.这是我正在研究的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()
Run Code Online (Sandbox Code Playgroud)

当我用wrapped()一行代替函数时,如下所示:

return "<"+tag+css_class+">" + fn() + "</"+tag+">"
Run Code Online (Sandbox Code Playgroud)

我得到TypeError.这是为什么?

Mar*_*ers 6

装饰器替换了函数对象; 语法基本上执行如下:

def hello():
    return "hello world"
hello = makeHtmlTag(tag="i", css_class="italic_css")(hello)
Run Code Online (Sandbox Code Playgroud)

makeHtmlTag()返回real_decorator()函数,该函数hello作为参数调用,然后返回wrapped().

因此,在调用decorator之后,hello现在绑定到wrapped()函数real_decorator()嵌套函数返回.

如果用一个只返回字符串的语句替换 def wrapped() .. 那么现在绑定到该字符串并且不再是函数.您无法调用字符串对象,从而导致异常.return wrappedreturnhelloTypeError