我能得到的最接近的是使用两个嵌套的上下文管理器,如下所示:
class SkippedException(Exception):
pass
class SkipContext:
def __enter__(self):
pass
def __exit__(self, type, value, tb):
return type is SkippedException
class SomeContext:
def __init__(self, arg):
self.arg = arg
def __enter__(self):
if self.arg == 1:
print "arg", self.arg
raise SkippedException()
def __exit__(self, type, value, tb):
pass
with SkipContext(), SomeContext(1):
print "body"
SkipContext
经理基本上抓住了SkippedException
内部经理提出的SomeContext
情况arg == 1
。
请注意,多个上下文表达式的语法仅在 Python 2.7 或更高版本中受支持。在早期版本中,您必须编写:
with SkipContext():
with SomeContext(1):
print "body"
上下文管理器,尽管文档中有声明,但当从 within 抛出异常时,它contextlib.nested
与上述嵌套语句的语义并不完全匹配,因此在这种情况下它不起作用。with
__enter__
应该注意的是,PEP 343提到不鼓励隐藏流控制的宏(如上下文管理器),并引用Raymond Chen 对隐藏流控制的咆哮。