为什么使用装饰器时需要"try-finally"@contextmanager?



我想知道为什么我们在使用@contextmanager装饰器时需要使用try-finally。

给出的示例提示:

from contextlib import contextmanager
@contextmanager
def managed_resource(*args, **kwds):
resource = acquire_resource(*args, **kwds)
try:
yield resource
finally:
release_resource(resource)

然而,在我看来,这将做完全相同的事情:

@contextmanager
def managed_resource(*args, **kwds):
resource = acquire_resource(*args, **kwds)
yield resource
release_resource(resource)

我肯定我一定错过了什么。我错过了什么?

因为在代码终止之前,无论发生什么情况(停电除外),finally语句都可以保证运行。这样写可以保证资源总是被释放

finally确保其下的代码始终执行,即使有异常引发:

from contextlib import contextmanager
@contextmanager
def exception_handler():
try:
yield
finally:
print("cleaning up")
with exception_handler():
result = 10 / 0

如果没有try-finally,上面的例子之后就不会自己清理了。

最新更新