Python装饰器调用报错:TypeError: 'str' object is not callable 求解
错误原因解析
当你用@wrapThis修饰msgReturnAsList时,Python会自动把msgReturnAsList这个函数对象作为参数传给wrapThis,然后将wrapThis的返回值重新赋值给msgReturnAsList。
你的wrapThis函数直接把传入的函数对象转成了大写字符串并返回,这就导致msgReturnAsList不再是可调用的函数,而是一个字符串。当你执行msgReturnAsList(b)时,本质是尝试调用一个字符串,自然会抛出TypeError: 'str' object is not callable。
修正方案及代码
要实现“先转大写再转列表返回”的需求,装饰器必须遵循正确的嵌套结构——接收原函数为参数,返回一个包装函数来处理逻辑:
def wrapThis(func): def wrapper(msg): # 第一步:将输入字符串转为大写 upper_msg = msg.upper() # 第二步:调用原函数将大写字符串转为列表 return func(upper_msg) return wrapper @wrapThis def msgReturnAsList(msg): return list(msg) b = "Convert to upper and output it as a list of letters." print(msgReturnAsList(b))
代码说明
wrapThis作为装饰器,接收原函数func(即msgReturnAsList)作为参数。- 内部的
wrapper函数是实际执行逻辑的载体:先处理输入字符串转大写,再将处理后的字符串传给原函数,完成转列表的操作。 wrapThis最终返回wrapper函数,此时msgReturnAsList被替换为wrapper,调用时会按顺序执行大写转换和列表转换。
内容的提问来源于stack exchange,提问作者user20684529
相关产品推荐
相关产品推荐

