为阶乘函数使用装饰器时为何出现报错?
装饰器与阶乘函数的错误修复
问题原因
你的计时器装饰器里的wrapper函数只打印了运行时间,但没返回原函数的执行结果。阶乘是递归调用,每次factorial(n-1)被装饰后返回None,执行n * factorial(n-1)时就会触发int乘None的类型错误,这就是报错的核心原因。
修复后的完整代码
import time # 必须导入time模块,原代码遗漏了这一步 def timer(func): """打印函数运行耗时的装饰器""" def wrapper(*args, **kwargs): t_start = time.time() result = func(*args, **kwargs) t_total = time.time() - t_start print(f"{func.__name__} took {t_total}s") return result # 关键:把原函数的结果返回 return wrapper @timer def factorial(n): if n == 0: return 1 else: return n * factorial(n-1)
进阶优化
如果想让装饰器保留原函数的名称、文档字符串等元信息,可以用functools.wraps包装wrapper:
import time from functools import wraps def timer(func): @wraps(func) # 保留原函数的元数据 def wrapper(*args, **kwargs): t_start = time.time() result = func(*args, **kwargs) t_total = time.time() - t_start print(f"{func.__name__} took {t_total}s") return result return wrapper
内容的提问来源于stack exchange,提问作者Jordan Bennett
相关产品推荐
相关产品推荐

