在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__
的内容。