TypeError:“ str”对象不可调用错误发生了-为什么?

问题描述

从未听说过装饰工。正在遵循引用了此内容的Udemy课程-https://pybit.es/decorators-by-example.html。在跟随这个例子。仅先尝试使用一个装饰器,但遇到错误时停止。

  1. 栏正确输出
  2. bork正确输出
  3. barf引发错误

找到了stackoverflow线程-Why TypeError: 'str' object is not callable error has occurred in my code-但它不能解释为什么bork起作用,而barf不能起作用。仍在阅读可能的stackoverflow线程以寻求可能的答案。

使用Python 3.8.2(在IDLE中运行)。

from functools import wraps

def makebold(fn):
    @wraps(fn)
    def wrapped(*args,**kwargs):
        return "<b>" + fn(*args,**kwargs) + "</b>"
    return wrapped()

def hello3():
    foo = "Hello World!"
    return foo

@makebold
def hello2():
    foo = "Hello World!"
    return foo

print('test hello3\n') #should be 'Hello World!'
bar = hello3()
print(bar)
print()
print('test makebold(hello3)\n') #should be '<b>Hello World!</b>'
bork = makebold(hello3)
print(bork)
print()
print('test hello2 with decorator\n') #should be '<b>Hello World!</b>'
barf = hello2()
print(barf)

我做错了什么?为什么bork起作用,但是barf引发错误?我该如何纠正此问题以使Barf也能正常工作?谢谢。

解决方法

在您的makebold装饰器中,您正在调用返回对象,这是不正确的做法。您要返回未调用的对象。

def makebold(fn):
    @wraps(fn)
    def wrapped(*args,**kwargs):
        return "<b>" + fn(*args,**kwargs) + "</b>"
    return wrapped  # <== HERE

在返回之前调用它时,调用hello2()时会发生什么,hello2已被评估为字符串,因此最终调用了字符串。通过不在装饰器中返回时调用该函数,您最终将改为使用hello2()调用该函数。