有这样一个需求:
如果一个函数handle_data()
其内部有调用print()
直接输出数据到屏幕,但是在某次调用handle_data()
时又希望其不输出到屏幕,可以使用装饰器来进行处理。
具体实现代码如下:
import os
import sys
def print_redict_wrapper(input_func):
def wrapper(data):
with open('temp.dat', 'w') as dest_file:
old_out = sys.stdout # 保存之前的输出位置
sys.stdout = dest_file # 设置当前输出到文件
input_func(data)
sys.stdout = old_out # 花园之前的输出位置
return wrapper
# 这里不使用@ print_redict_wrapper
# 是希望直接调用handle_data()时还是输出到屏幕
def handle_data(data):
print(data)
if __name__ == '__main__':
handle_data('hellohi before')
# 下面调用handle_data希望不输出到屏幕
# 使用print_redict_wrapper进行包装
wrapper_func = print_redict_wrapper(handle_data)
wrapper_func('hellohi')
handle_data('hellohi after')
代码输出为:
hellohi before
hellohi after
生成的临时文件temp.dat
也可以将其删除。