在Python中使用资源的优雅方式?

时间:2014-01-06 13:24:53

标签: python

我想找到一种优雅的方法来执行以下操作:

try:
    with some_resource:
        # got it
        do_something()

except ResourceUnavailableError:
    # didn't get it
    do_something_else()

此:

  1. 尝试获取资源
  2. 成功后,它会执行某些操作,然后正确释放资源
  3. 失败时,它会做其他事情
  4. 虽然代码行不多,但我发现如果我要在很多不同的地方继续写这个代码,那就不是很优雅了。

    我几乎希望我能写出如下内容(我知道这不是真正的Python代码):

    with some_resource:
        # got it
        do_something()
    
    # an optional else
    else:
        # didn't get it
        do_something_else()
    

    有谁知道是否有可能在Python中沿着这些方向写一些内容? 谢谢!

1 个答案:

答案 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,这使得编写自己的上下文管理器几乎是微不足道的。