我必须做StringIO.close()吗?

2024-04-28 07:02:19 发布

您现在位置:Python中文网/ 问答频道 /正文

一些代码:

import cStringIO

def f():
    buffer = cStringIO.StringIO()
    buffer.write('something')
    return buffer.getvalue()

documentation说:

StringIO.close(): Free the memory buffer. Attempting to do further operations with a closed StringIO object will raise a ValueError.

我是否必须执行buffer.close(),否则当缓冲区超出作用域并被垃圾收集时,它将自动发生?

更新:

我做了个测试:

import StringIO, weakref

def handler(ref):
    print 'Buffer died!'

def f():
    buffer = StringIO.StringIO()
    ref = weakref.ref(buffer, handler)
    buffer.write('something')
    return buffer.getvalue()

print 'before f()'
f()
print 'after f()'

结果:

vic@wic:~/projects$ python test.py 
before f()
Buffer died!
after f()
vic@wic:~/projects$

Tags: importrefclosereturndefbuffersomethingwrite
3条回答

来源:

class StringIO:
    ...
    def close(self):
        """Free the memory buffer.
        """
        if not self.closed:
            self.closed = True
            del self.buf, self.pos

所以StringIO.close只需释放内存缓冲区,删除对StringIO.bufStringIO.pos的引用。但是,如果self是垃圾收集的,那么它的属性也将是垃圾收集的,其效果与StringIO.close相同。

StringIO.close()只是一个方便的例程,这些例程采用类似于文件的方式并最终试图关闭它们。不需要你自己这么做。

一般来说,最好还是调用close()或使用with语句,因为在特殊情况下可能会出现一些意外行为。例如,expat-IncrementalParser似乎希望关闭一个文件,或者在某些罕见的情况下,在超时发生之前,它不会返回解析的xml的最后一个tidbit。

但是对于为您处理结束的with-语句,您必须使用io-模块中的StringIO类,如Ivc的注释中所述。

这是我们通过手动关闭StringIO解决的一些遗留sax解析器脚本中的一个主要问题。

“超出范围”关闭不起作用。它只是等待超时限制。

相关问题 更多 >