Python带参数函数的装饰器调用报错TypeError,求问题解析
问题分析与解决
你的代码存在两个关键问题:
1. 装饰器的wrapper函数未接收参数
被装饰的fat函数需要接收num参数,但你定义的wrapper函数没有设置任何参数。调用fat(5)时,实际是调用wrapper(5),但wrapper不接受参数,因此触发TypeError。
2. return语句位置错误导致统计代码无法执行
在wrapper中,return func()会直接返回原函数的结果并退出wrapper,后续的时间计算和打印语句永远不会被执行,完全起不到统计运行时间的作用。
修正后的代码
import time # 补充time模块导入 def tictoc(func): def wrapper(*args, **kwargs): # 用可变参数接收任意类型的参数 t1 = time.time() result = func(*args, **kwargs) # 先保存原函数的执行结果 t2 = time.time() - t1 print(f'Took {t2} seconds to run.') return result # 最后返回原函数的结果 return wrapper @tictoc def fat(num): f = 1 for x in range(1, num+1): f *= x return f print(fat(5))
修正说明
wrapper(*args, **kwargs):通过可变参数适配任意参数的函数,让装饰器不再局限于无参函数。- 调整执行顺序:先执行原函数并保存结果,再计算时间差并打印,最后返回结果,既保证统计逻辑生效,又不破坏原函数的返回值。
- 补充
import time:原代码使用了time.time()但未导入模块,运行会触发导入错误,这里补上必要的导入操作。
内容的提问来源于stack exchange,提问作者Gustavo Nunes
相关产品推荐
相关产品推荐

