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

标签 python

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

try:
    with some_resource:
        # got it
        do_something()

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

这个:

  1. 尝试获取资源
  2. 成功后,它会做一些事情,然后正确地释放资源
  3. 失败时,它会做其他事情

虽然代码行数不多,但我发现如果我必须在很多不同的地方一直写这个,它不是很优雅。

我几乎希望我能写出如下内容(我知道这不是真正的 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/

相关文章:

python - 在 python 中用元组制作成员向量

python - 如何并行循环以更改 Python 字典中的对象?

python - pd.read_html(url) - 尴尬的表格设计

python - 如何使用google python oauth库来实现OpenID Connect?

python - Pandas 根据当前 df 中的列创建一个新的 df

python - 在python多处理中查找异常

python - 在 Ubuntu 服务器上安装软件包时出现内存不足问题

python - 基于另一列复制行

python - Pandas Rolling Groupby 移回 1,试图滞后于滚动总和

python - Python 中分离表单和处理