【问题标题】:Python - Decorator errorPython - 装饰器错误
【发布时间】:2014-03-25 12:39:01
【问题描述】:

我是 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。这是为什么呢?

【问题讨论】:

  • 真正的装饰器需要返回一个函数,而不是一个字符串。

标签: python decorator python-decorators


【解决方案1】:

装饰器替换函数对象;语法本质上是这样执行的:

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

makeHtmlTag()返回real_decorator()函数,该函数以hello为参数调用,又返回wrapped()

因此,在调用装饰器后,hello 现在绑定到 wrapped() 函数,real_decorator() 嵌套函数返回。

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

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 2018-01-28
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 2015-12-10
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多