使用函数包装器了解decorator中的TypeError

时间:2015-10-30 20:18:39

标签: python function python-2.7 decorator typeerror

Python装饰器的新手,并尝试理解以下代码的“流程”:

def get_text(name):
    return "lorem ipsum, {0} dolor sit amet".format(name)

def p_decorate(func):
    print "here's what's passed to p_decorate(func): %s" % func 
    def func_wrapper(name):
        print "here's what's passed to the inner func_wrapper(name) function: %s" % name
        return "<p>{0}</p>".format(func(name))
    return func_wrapper

my_get_text = p_decorate(get_text("fruit"))
print my_get_text("GOODBYE")

my_get_text = p_decorate(get_text)
print my_get_text("veggies")

为什么print my_get_text("GOODBYE")行获得TypeError: 'str' object is not callable

如果我已经将get_text(name)函数传递给行中的p_decorate(func),即使我还给get_text()字符串“水果”,为什么我不能重新分配通过的内容对于name的{​​{1}}参数?

1 个答案:

答案 0 :(得分:3)

你必须像这样定义my_get_text

my_get_text = p_decorate(get_text)

因为p_decorate需要一个函数作为参数而get_text("fruit")是一个字符串,因为这是get_text在调用时返回的内容。因此错误。

这就是装饰者的意思,修改一个功能。如果将参数传递给函数,则会对其进行求值,结果(通常)与生成函数的函数没有任何关联。