gpt4 book ai didi

python - 异常值错误 : 'I/O operation on uninitialized object' in

转载 作者:行者123 更新时间:2023-11-28 17:38:50 27 4
gpt4 key购买 nike

我们有一个名为 run.py 的小型自动化测试进程在工作,文件中有一个名为

class flushfile(io.TextIOWrapper):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()

它给出了这个错误:

Exception ValueError: 'I/O operation on uninitialized object' in

每次我们运行测试,但似乎没有任何影响。该类的上下文是我们在打印到文本文件和命令行后刷新缓冲区。

sys.stdout = flushfile(sys.stdout)

在代码中是这样调用的。

对于我的生活,我无法弄清楚它可能是什么。

最佳答案

您必须在包装器中添加 flush() 方法:

class flushfile(io.TextIOWrapper):
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
def flush(self):
self.f.flush()

一个简单的测试是:

import sys
sys.stdout = flushfile(sys.stdout)
print("TEST")

如果没有 flush(),您将在脚本死机并尝试调用 new sys 的 flush() 时收到错误。标准输出

无论如何,如果你在退出前恢复 stdout,你可以得到相同的结果:

import sys
orig = sys.stdout
sys.stdout = flushfile(sys.stdout)
print("TEST")
sys.stdout = orig

编辑

也许您不需要包装文件对象,而只需要一个新的 write() 方法。 Python 首先是一种函数式编程语言,一种更 pythoninc 的方式来做你想做的事情是改变 sys.stdout.write 方法。遵循一个实现示例:

def make_write_flusher(f):
orig = f.write
def new_write(data):
orig(data)
f.flush()
f.write = new_write

import sys
make_write_flusher(sys.stdout)
print("TEST")

最后的考虑是,如果您在解决问题的原始实现中调用 super 但真正的想法是您并没有真正使用包装器,并且以下两个实现都给出相同的结果.在 Python 中,如果存在属性/方法以及何时使用它,接口(interface)并不真正重要。

class flushfile(io.TextIOWrapper):
def __init__(self, f):
super(flushfile,self).__init__(f)
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()

class flushfile():
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
def flush(self):
self.f.flush()

关于python - 异常值错误 : 'I/O operation on uninitialized object' in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446829/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com