【发布时间】:2015-12-29 21:55:24
【问题描述】:
我是否可以有一个偶尔不产生的上下文管理器,在这种情况下 with 语句中的代码根本不执行?
import contextlib
@contextlib.contextmanager
def MayNotYield(to_yield):
if to_yield:
yield
with MayNotYield(True):
print 'This works.'
with MayNotYield(False):
print 'This errors.'
我可以要求用户用 try-catch 包装 with 语句,但这不是首选。我也可以执行以下操作,但这也很丑。
import contextlib
@contextlib.contextmanager
def AlwaysYields(to_yield):
if to_yield:
yield 1
else:
yield 2
with AlwaysYields(True) as result:
if result == 1:
print 'This works.'
【问题讨论】:
-
你真正想要实现什么?
-
@jonrsharpe:我的用例是将初始化和清理代码放在上下文管理器中。上下文管理器的用户在正文中运行他们的代码。我的上下文管理器还分叉了几个进程,并且只有一个进程留给用户。所有其他进程都由库自己处理。
-
@shaoyl85:这仍然不能说明你为什么不
yield。看起来您正在尝试将if语句与上下文管理器结合起来,以解决无法在if语句中分配的问题,而不是尝试管理资源。 -
您能否在问题中解释这一点,并举一个不那么抽象的例子?这可能有助于澄清这是否是 XY problem 并为您提供更好的答案。
-
@jonrsharpe:谢谢!我相信我的问题可以有很多解决方案。我目前的问题是是否可以跳过产量。而且我认为答案确实就像 Blckknght 所说的那样,“with”语句本身没有跳过正文的选项。这不是 contextlib.contextmanager 的问题。我很擅长。
标签: python contextmanager