我想找到一种优雅的方法来执行以下操作:
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中沿着这些方向写一些内容? 谢谢!
答案 0 :(得分:4)
不,with
没有else
阻止。但是你可以编写自己的上下文管理器来处理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()
因此,如果ResourceUnavailableError
块中出现with
,则会为您调用do_something_else
。
这使用@contextlib.contextmanager()
decorator,这使得编写自己的上下文管理器几乎是微不足道的。