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
相关产品推荐
相关产品推荐

