You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:12:18