【问题标题】:Returning StringIO object返回 StringIO 对象
【发布时间】:2019-05-21 18:07:06
【问题描述】:

我有以下 python 代码:

def parse_object(object):
    data = object.read()
    do_other_stuff(data)
def get_object():
    content = "abc"
    try:
        object = StringIO()
        object.write(content)
        return object
    finally:
        object.close()
def main():
    object = get_object()
    parse_object(object)

parse_object 获取一个文件对象或一个 StringIO 实例,但显然 StringIO 对象在 get_object 结束后立即关闭。
有没有办法在 get_object 使用后关闭对象?
parse_object 无法更改,因为它位于我宁愿不更改的内置库中,get_object 在我的代码中

【问题讨论】:

  • 无需关闭StringIO 实例。只需返回它并删除try/finally
  • 但是我想防止内存泄漏,特别是如果我打算这样做数百次...
  • “关闭”资源不会释放它占用的内存。 Python 是垃圾收集器。当一个变量不再使用时,它所占用的空间将被自动释放。对于像StringIO 这样您为自己使用而创建的完全内部资源,此机制运行良好,您不需要做任何特别的事情。只需创建它们,使用它们,不要太担心。对于外部资源(如数据库连接和文件),可能需要手动关闭,这样您就不会占用它们超过需要的时间。但即使在这里,“关闭”也不等于“感受记忆”。

标签: python python-2.7 python-object


【解决方案1】:

在 Python 中自动关闭是上下文管理器的典型工作。参考https://docs.python.org/2.7/library/contextlib.html#contextlib.closing

from contextlib import contextmanager


def parse_object(object):
    data = object.read()
    do_other_stuff(data)

@contextmanager
def get_object():
    content = "abc"
    try:
        object = StringIO()
        object.write(content)
        yield object
    finally:
        object.close()

def main():
    with get_object() as object:
        parse_object(object)

【讨论】:

  • ...在这种情况下没有必要。关闭 StringIO 对象不会有任何收获。
猜你喜欢
  • 2011-05-18
  • 2015-06-29
  • 1970-01-01
  • 2015-03-19
  • 2015-09-07
  • 2017-08-29
  • 2011-07-31
  • 2023-04-11
相关资源
最近更新 更多