代码改变世界

Python 上下文管理器:控制输出的结果能同时保存到文件中

2018-12-08 22:17  JohnRain  阅读(555)  评论(0编辑  收藏  举报

说明

以下这个类print_and_save可以修饰你的函数或管理上下文,让你的函数或命令的输出结果在控制台输出的同时,还能存储为你指定的文件
免去你是用写日志函数的必要

优点:

  • 完全不需要修改代码对函数或语句直接装饰或通过上下文管理即可,见下面例子

此内容为个人原创,转载请注明出处:

import sys

class print_and_save(object):
    def __init__(self, filepath):
        self.file = open(filepath, 'a')
        self.old = sys.stdout  # 将当前系统输出储存到临时变量
        sys.stdout = self

    def __enter__(self):
        pass

    def __call__(self,func):
        def wrapper(*args, **kwargs):
            frs = func(*args, **kwargs)
            self._exit()
            return frs
        return wrapper

    
    def write(self, message):
        self.old.write(message)
        self.file.write(message)

    def flush(self):
        self.old.flush()
        self.file.flush()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self._exit()

    def _exit(self):
        self.file.flush()
        self.file.close()
        sys.stdout = self.old

方法1. 直接装饰print函数

with print_and_save("a.txt"):  
    print("directed print")

方法2. 装饰用户函数

@print_and_save("a.txt")  
def decorated_out():
    print("decorator print")

decorated_out()

方法3. 定义用户函数上下文方式

def contextout(text):
    print("context function print is %s" % text)

with print_and_save("a.txt"):  
    contextout("ok")

结果

# 控制台
directed print
decorator print
context function print is ok

# 文件a.txt内容
directed print
decorator print
context function print is ok

此内容为个人原创,转载请注明出处:
https://blog.csdn.net/u011173298/article/details/88423504
https://www.cnblogs.com/JohnRain/p/10089419.html