Python装饰器未执行无法打印指定星号装饰图案问题求助
问题解决
错误原因
- 你定义的
func1内部直接执行print(a*b)输出计算结果,函数自身的返回值为None - 装饰器的
wrapper函数虽然将星号横幅、函数返回值拼接为了完整字符串,但这个最终字符串没有被打印,只触发了func1内部的打印逻辑,因此仅输出20,没有上下装饰图案。
修复方案
方案1:在装饰器内部直接完成打印(推荐,无需修改原函数调用逻辑)
def banner(str1, len1): def decorator(func): def wrapper(*args1): str2 = str1 * len1 # 打印顶部横幅 print(str2) # 执行原函数,保留原函数的打印逻辑 func(*args1) # 打印底部横幅 print(str2) return wrapper return decorator @banner('*', 6) def func1(a, b): print(a*b) func1(5,4)
方案2:修改原函数为返回值,调用时打印装饰器返回的拼接字符串
def banner(str1, len1): def decorator(func): def wrapper(*args1): new_line = '\n' str2 = str1 * len1 return f'{str2}{new_line}{func(*args1)}{new_line}{str2}' return wrapper return decorator @banner('*', 6) def func1(a, b): # 改为返回计算结果而非直接打印 return a*b # 调用时打印装饰器返回的完整内容 print(func1(5,4))
两种方案运行后都将输出目标格式:
****** 20 ******
内容的提问来源于stack exchange,提问作者Deepak Mishra
相关产品推荐
相关产品推荐

