是否可以转移上下文管理器的所有权?

时间:2016-07-20 10:13:15

标签: python contextmanager

在C ++的RAII世界中,将资源的所有权从一个资源管理对象转移到另一个资源管理对象(例如通过复制或移动)并不罕见。与Python上下文管理器有任何等价物吗?

也就是说,如果我写了一个函数:

def open_and_do_something(filename):
    with open(filename, "r") as f:
        do_something_that_might_raise(f)

open_and_do_something是否有办法将f返回给调用者或取消上下文管理器?必须使用try .. except来编写此类函数吗?

在C ++中,我通常可以通过执行以下操作取消管理:

FILE* open_and_do_something(const std::string& filename)
{
    MyFileWrapper f(fopen(filename.c_str(), "r"));
    do_something_that_might_raise(f)

    // We made it here alive.
    return f.release();
}

// And in the calling code...
MyFileWrapper f(open_and_do_something(filename));

在Python中,我尝试过:

def open_and_do_something(filename):
    with open(filename, "r") as f:
        do_something_that_might_raise(f)
        # We made it here alive.
        ret = f
        f = dummy_context_manager()
        return ret

但似乎重新分配f并未更改with阻止调用__exit__的内容。

0 个答案:

没有答案