擅长:python、mysql、java
<p>我能得到的最接近的方法是使用两个嵌套的上下文管理器,如下所示:</p>
<pre><code>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"
</code></pre>
<p><code>SkipContext</code>管理器实质上捕捉由内部<code>SomeContext</code>管理器引发的{<cd2>},在{<cd4>}的情况下。在</p>
<p>请注意,多个上下文表达式的语法仅在Python2.7或更高版本中受支持。在早期版本中,您必须编写:</p>
^{pr2}$
<p>尽管文档中有声明,<code>contextlib.nested</code>上下文管理器与上面嵌套的<code>with</code>语句的语义不完全匹配,当从<code>__enter__</code>中抛出异常时,它不起作用。在</p>
<p>需要注意的是,<a href="http://www.python.org/dev/peps/pep-0343/" rel="nofollow">PEP 343</a>提到了隐藏流控制的宏(如上下文管理器)和引用<a href="http://blogs.msdn.com/b/oldnewthing/archive/2005/01/06/347666.aspx" rel="nofollow">Raymond Chen's rant against hidden flow control</a>是不可取的。在</p>