如何为代码中每个print语句添加额外输出?优先使用装饰器
需求与问题
我希望自动检测代码中调用的print语句,在其输出后自动添加一条空行,无需手动在每个print后添加空行。当前代码会连续输出10次“Hello”,期望每个“Hello”后跟随一个空行,重复10次。优先采用装饰器方案,也可接受其他解决方法。我尝试的代码如下:
def readability(func): def wrapper(*args,**kwargs): result = func(*args, **kwargs) if callable(func) and func.__name__ == 'print': print(' ') return result return wrapper @readability def printing(): j=10 while j>0: print('hello') j-=1 printing()
问题分析
你当前的装饰器作用在了自定义的printing函数上,而非内置的print函数,所以func.__name__ == 'print'这个判断永远不会成立,自然无法触发空行输出。
解决方案
方案一:装饰内置print函数(推荐)
直接装饰系统内置的print函数,让所有print调用自动追加空行:
def add_empty_line(func): def wrapper(*args, **kwargs): # 执行原print逻辑 func(*args, **kwargs) # 输出空行 print() return wrapper # 替换内置print为装饰后的版本 print = add_empty_line(print) def printing(): j = 10 while j > 0: print('hello') j -= 1 printing()
方案二:自定义替代打印函数
如果不想修改内置函数,可自定义一个带空行的打印函数,替换代码中的print调用:
def my_print(*args, **kwargs): # 先输出原内容 print(*args, **kwargs) # 输出空行 print() def printing(): j = 10 while j > 0: my_print('hello') j -= 1 printing()
方案三:装饰器包裹函数(局部替换print)
通过装饰器临时替换函数内部的print引用,只对被装饰的函数生效,不影响外部:
def auto_empty_line(func): def wrapper(*args, **kwargs): # 保存原始print函数 original_print = print # 定义带空行的新print def new_print(*args, **kwargs): original_print(*args, **kwargs) original_print() # 临时替换 print = new_print try: # 执行原函数 result = func(*args, **kwargs) finally: # 恢复原始print print = original_print return result return wrapper @auto_empty_line def printing(): j = 10 while j > 0: print('hello') j -= 1 printing()
内容的提问来源于stack exchange,提问作者Acion
相关产品推荐
相关产品推荐

