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

Python使用performance装饰器统计函数耗时出现TypeError错误

Python装饰器运行报错问题解决

错误原因

你定义的performance是无参数装饰器,设计为直接接收被装饰函数作为唯一入参。使用@performance()时额外添加了括号,会触发performance函数的直接调用,此时没有传入被装饰函数作为fun参数,因此抛出TypeError: performance() missing 1 required positional argument: 'fun'。

解决方法

方案1:移除装饰器后的括号(无额外参数需求时推荐)

不需要给装饰器传自定义参数时,直接去掉@performance后的括号即可,修正后完整代码如下:

from time import time

def performance(fun):
    def wrapper_fun(*args , **keyargs):
        t1 = time()
        res = fun(*args,**keyargs)
        t2 = time()
        print(f'took {t2 -t1} s')
        return res
    return wrapper_fun
    
@performance
def long_time():
    print('1')
    for i in range(100000):
        i*5
        
@performance
def long_time2():
    print('2')
    for i in list(range(100000)):
        i*5
        
long_time()
long_time2()

方案2:改写为带参数的装饰器(需要保留括号调用时使用)

如果需要保留@performance()的写法,或者后续要扩展装饰器的自定义参数(比如计时单位、日志前缀等),可以将装饰器调整为三层嵌套结构,支持参数传入:

from time import time

# 外层接收装饰器的自定义参数
def performance(unit='s'):
    # 中层接收被装饰的函数
    def decorator(fun):
        def wrapper_fun(*args , **keyargs):
            t1 = time()
            res = fun(*args,**keyargs)
            t2 = time()
            cost = t2 - t1
            if unit == 'ms':
                cost *= 1000
            print(f'took {cost:.4f} {unit}')
            return res
        return wrapper_fun
    return decorator
    
# 支持不加参数直接带括号调用
@performance()
def long_time():
    print('1')
    for i in range(100000):
        i*5

# 也支持传入自定义参数调用
@performance(unit='ms')
def long_time2():
    print('2')
    for i in list(range(100000)):
        i*5
        
long_time()
long_time2()

内容的提问来源于stack exchange,提问作者Nik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 10:54:03