我想要一个文件对象,在写入数据时直接刷新到文件中,并编写了以下内容:
class FlushingFileObject(file):
def write(self,*args,**kwargs):
return_val= file.write(self,*args,**kwargs)
self.flush()
return return_val
def writelines(self,*args,**kwargs):
return_val= file.writelines(self,*args,**kwargs)
self.flush()
return return_val
但有趣的是,当我写信给它的时候,它并没有变红,所以我尝试了一些方法,包括:
^{pr2}$是冲的。在
为什么子类化file
在这个实例中不起作用?在
好问题。在
这是因为Python通过绕过Python级别的
write
方法并直接调用fputs
来优化对file
对象的调用。在要了解这一点,请考虑:
从未调用
write
方法!在现在,当对象不是
^{pr2}$file
的子类时,一切都按预期工作:仔细研究一下Python源代码,看起来罪魁祸首是
PyFile_WriteString
函数,它由print
语句调用,它检查要写入的对象是否是file
的实例,如果是,则绕过对象的方法并直接调用fputs
:file.flush()
的文档说明:注意 flush()不一定要将文件的数据写入磁盘。使用flush()后跟操作系统同步()以确保这种行为。在
我测试了FlushingFileObject的第一个版本,没有操作系统同步打电话。文件没有刷新。插入
os.fsync(self.fileno())
后,文件被刷新。然后我把操作系统同步打电话现在文件被刷新了!我想可以肯定的是操作系统同步打电话是必要的。在相关问题 更多 >
编程相关推荐