欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-11 11:00:34
说明 以下这个类 可以修饰你的函数,让你的函数或命令的输出结果在控制台输出的同时,还能存储为你指定的文件 免去你是用写日志函数的必要 优点: 完全不需要修改代码对函数或语句直接装饰就行 直接修饰语句 修饰函数中的控制台输出 以装饰器的方式修饰输出 结果 此内容为个人原创,转载请注明出处:https: ......

说明

以下这个类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 __exit__(self, exc_type, exc_val, exc_tb):
        self._exit()

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

直接修饰语句

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

修饰函数中的控制台输出

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

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

以装饰器的方式修饰输出

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

decorated_out()

结果

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

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

此内容为个人原创,转载请注明出处:https://www.cnblogs.com/johnrain/p/10089419.html