我是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()
当我用一行替换函数wrapped()
时,如下所示:
return "<"+tag+css_class+">" + fn() + "</"+tag+">"
我得到TypeError
。那是为什么?
答案 0 :(得分:6)
装饰器替换了函数对象;语法基本上执行为:
def hello():
return "hello world"
hello = makeHtmlTag(tag="i", css_class="italic_css")(hello)
makeHtmlTag()
返回real_decorator()
函数,该函数以hello
为参数调用,然后返回wrapped()
。
因此,在调用decorator之后,hello
现在绑定到wrapped()
函数,real_decorator()
嵌套函数返回。
如果替换 def wrapped()
.. return wrapped
并使用return
语句只返回一个字符串,那么hello
现在绑定到该字符串并且不再是一个功能。您无法调用字符串对象,从而导致TypeError
例外。