我想找到一种优雅的方式来执行以下操作:
try:
with some_resource:
# got it
do_something()
except ResourceUnavailableError:
# didn't get it
do_something_else()
这个:
- 尝试获取资源
- 成功后,它会做一些事情,然后正确地释放资源
- 失败时,它会做其他事情
虽然代码行数不多,但我发现如果我必须在很多不同的地方一直写这个,它不是很优雅。
我几乎希望我能写出如下内容(我知道这不是真正的 Python 代码):
with some_resource:
# got it
do_something()
# an optional else
else:
# didn't get it
do_something_else()
有谁知道是否可以在 Python 中按照这些思路编写一些东西? 谢谢!!
最佳答案
不,with
没有else
block 。但是您可以编写自己的上下文管理器来处理 else
部分:
from contextlib import contextmanager
@contextmanager
def handle_unavailable(resource, exception, exception_handler):
try:
with resource:
yield resource
except exception:
exception_handler()
并像这样在任何地方使用它:
with handle_unavailable(some_resource, ResourceUnavailableError, do_something_else):
do_something()
因此,如果在 with
block 中引发了 ResourceUnavailableError
,则会为您调用 do_something_else
。
这利用了 @contextlib.contextmanager()
decorator ,这使得编写您自己的上下文管理器变得几乎微不足道。
关于python - 在 Python 中使用资源的优雅方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20951000/