一些代码:
import cStringIO
def f():
buffer = cStringIO.StringIO()
buffer.write('something')
return buffer.getvalue()
Run Code Online (Sandbox Code Playgroud)
该文件说:
StringIO.close():释放内存缓冲区.尝试使用已关闭的StringIO对象执行进一步操作将引发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()'
Run Code Online (Sandbox Code Playgroud)
结果:
vic@wic:~/projects$ python test.py
before f()
Buffer died!
after f()
vic@wic:~/projects$
Run Code Online (Sandbox Code Playgroud)
Don*_*ion 14
通常,调用close()或使用该with语句仍然更好,因为在特殊情况下可能会出现一些意外行为.例如,expat- IncrementalParser似乎期望一个文件被关闭,或者它将不会返回解析的xml的最后一个tidbit,直到在某些罕见的情况下发生超时.
但对于with处理结束的-statement,你必须使用-Modules中的StringIO类io,如Ivc的注释中所述.
这是我们通过手动关闭StringIO解决的一些遗留sax-parser脚本中的一个主要问题.
"超出范围"的关闭不起作用.它只是等待超时限制.
war*_*iuc 12
从来源:
class StringIO:
...
def close(self):
"""Free the memory buffer.
"""
if not self.closed:
self.closed = True
del self.buf, self.pos
Run Code Online (Sandbox Code Playgroud)
因此,StringIO.close只需释放内存缓冲区,删除对StringIO.buf和的引用StringIO.pos.但如果self是垃圾收集,其属性也将被垃圾收集,具有相同的效果StringIO.close.
StringIO.close()对于采用类似文件并最终尝试关闭它们的例程来说,它只是一种便利.没有必要自己这样做.
| 归档时间: |
|
| 查看次数: |
14567 次 |
| 最近记录: |