gpt4 book ai didi

python-3.x - python3上下文管理器强制提前退出

转载 作者:行者123 更新时间:2023-12-03 14:50:19 25 4
gpt4 key购买 nike

我需要创建一个上下文管理器,当满足某些条件时,可以强制提前退出。

更多细节:

上下文管理器需要处理检查/锁定/释放资源。在 __enter__ ,上下文管理器需要检查资源是否被锁定。如果是,我想要 __exit__调用而不执行上下文中的代码。否则,上下文管理器获取资源,执行上下文代码,并清理 __exit__ 中的资源。 .

它可能看起来像这样:

class my_context_manager:
def __enter__(self):
if resource_locked():
self.__exit__(None, ResourceLockedException(), None)
else:
acquire_resource()

def __exit__(self, *exc_info):
if not isinstance(exc_info[1], ResourceLockedException):
release_resource()
else:
log.warn("Resource already in use.")

然而,上面的代码实际上并不工作,因为调用 __exit__ __enter__ 内部不会阻止上下文中的代码被执行。

或者,我可以抛出 ResourceLockedException来自 __enter__ , 但后来 __exit__不会被调用,因为异常会从上下文管理器本身抛出。如果资源被锁定,我希望能够捕获异常、记录警告并且不进入上下文。

这归结为找到一些提前关闭上下文的方法,以便 __exit__被调用并且不执行上下文代码。有没有办法调整上述任何一个想法来做到这一点?还是有其他方法?

最佳答案

是的,您不能手动调用__exit__像这样。另一种选择很简单raise异常并让另一个构造管理它。您可以使用 try-except或启动另一个上下文管理器来记录这些:

from contextlib import contextmanager

@contextmanager
def log_exception():
try:
yield
except ResourceLockedException as e:
log.warn(e)

并将您的原始上下文管理器更改为:
class my_context_manager:
def __enter__(self):
if True:
raise ResourceLockedException("Resource already in use")
acquire_resource()
def __exit__(self):
release_resource()

并调用它:
with log_exception(), my_context_manager():
# do things when resource acquired.

当然你可以简单地使用 try-except和嵌套 with在里面或使用 if条款替代。

关于python-3.x - python3上下文管理器强制提前退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41124672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com