一些代码:
import cStringIO
def f():
buffer = cStringIO.StringIO()
buffer.write('something')
return buffer.getvalue()
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$
来源:
所以
StringIO.close
只需释放内存缓冲区,删除对StringIO.buf
和StringIO.pos
的引用。但是,如果self
是垃圾收集的,那么它的属性也将是垃圾收集的,其效果与StringIO.close
相同。StringIO.close()
只是一个方便的例程,这些例程采用类似于文件的方式并最终试图关闭它们。不需要你自己这么做。一般来说,最好还是调用
close()
或使用with
语句,因为在特殊情况下可能会出现一些意外行为。例如,expat-IncrementalParser
似乎希望关闭一个文件,或者在某些罕见的情况下,在超时发生之前,它不会返回解析的xml的最后一个tidbit。但是对于为您处理结束的
with
-语句,您必须使用io
-模块中的StringIO
类,如Ivc的注释中所述。这是我们通过手动关闭StringIO解决的一些遗留sax解析器脚本中的一个主要问题。
“超出范围”关闭不起作用。它只是等待超时限制。
相关问题 更多 >
编程相关推荐